2012-04-09 45 views
0

我正在扩展一个现有的Django论坛应用程序(DjangoBB),以允许用户选择加入/退出特定论坛和/或特定主题的通知。我的网站上已经有了一个现有的通知基础架构,还有一个现有的全局设置可以开启/关闭论坛通知。Django论坛数据库设计

我想要做的是允许每个用户订阅/取消订阅特定论坛或主题,有效覆盖其全局设置。例如,如果我的全局设置是“通知关闭”,那么我将不会收到任何通知,除非我设置特定论坛为“通知开启”,在这种情况下,我会收到该论坛中所有内容的通知,除非我设置了该论坛中的一个线索“通知关闭”。如果任何线程或主题没有设置设置,则默认链接。

我的问题是什么是在Django的数据库中表示所有这些的最佳方式?我有两个想法:

class ForumNotificationSetting(models.Model): 
    user = models.ForeignKey(User) 
    forum = models.ForeignKey(Forum) 
    setting = models.NullBooleanField(default=None) 

我也有一个类似的模型为TopicNotificationSetting。这样,每当用户更改其论坛设置时,我都会创建(或修改)NotificationSetting对象以反映其新设置。这种方法看起来很简单,但缺点是如果许多人为很多论坛创建设置,那么每当创建新的论坛帖子时,为每个人创建通知将是O(n^2)。 (我认为...?)

我能想到的第二种方法是在每个用户的配置文件中为其所设置的所有论坛创建一个ManyToMany字段。这种方式似乎更加复杂(因为我必须为'论坛','关闭论坛','主题'和'主题关闭'共有4个M2M字段),而且我不确定是否会有任何性能优势与否。

你会如何解决这个问题?

+1

你现在有什么是一个M2M领域,只是一个与一个额外的领域。当您创建常规M2M时,会自动为关系创建这样的表格。 – agf 2012-04-09 21:41:57

回答

2

也许你可以创建的线程或论坛物体,例如水平的M2M关系:

class Thread(models.Model): 
    subscribers = models.ManyToManyField(User) 
    other attributes... 

然后,作为一个用户(联合国)从主题订阅,您添加或删除线程对象的订阅者属性。

在您的应用程序逻辑中,当用户创建帖子,线程或论坛时,您可以检查其总体通知设置,如果设置为True,则将它们添加到新创建的Thread,Post或论坛。

每次更新线索,帖子或论坛时,您都可以通知所有订阅者。

我假设你需要一些逻辑来处理升级(我找不到适当的词,对不起),即我会假设一个线程更新通知也应该触发一个论坛更新通知(或者应该吗?)。然后,你当然应该小心,一个用户不会得到邮寄,线程和论坛通知垃圾邮件单个帖子更新...