Django论坛数据库设计

时间:2012-04-09 21:20:33

标签: database django notifications forum

我正在扩展现有的Django论坛应用程序(DjangoBB),以允许用户选择加入/退出特定论坛和/或特定线程的通知。我的网站上已有现有的通知基础架构,以及现有的全局设置,可以打开/关闭论坛通知。

我想要做的是允许每个用户订阅/取消订阅特定的论坛或主题,有效地覆盖他们的全局设置。例如,如果我的全局设置为“Notifications Off”,那么我不会收到任何通知,除非我将特定论坛设置为“Notifications On”,在这种情况下我会收到该论坛中所有内容的通知,除非我设置该论坛中的一个帖子是“Notifications Off”。如果任何线程或主题没有设置设置,它将默认链。

我的问题是在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 个答案:

答案 0 :(得分:2)

也许你可以在Thread或Forum对象的层面上创建一个M2M关系,例如:

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

然后,当用户(un)从Thread订阅时,您可以从Thread对象的subscriber属性中添加或删除它们。

在您的应用程序逻辑中,当用户创建帖子,帖子或论坛时,您可以只检查他们的整体通知设置,如果设置为True,则将它们添加到新创建的主题,帖子或论坛的subscriber属性中

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

我假设您需要一些逻辑来处理升级(我找不到合适的词,抱歉),即我假设线程更新的通知也应该触发论坛更新的通知(还是应该?)然后你当然应该注意用户不会通过帖子,帖子和论坛通知发送垃圾邮件以进行单个帖子更新...