Django数据库模型 - 消息和收件人:多对多还是多对一?

时间:2016-08-30 16:46:03

标签: mysql django database django-models

我在我的数据库中使用MySQL,并在我的Django应用程序中使用以下class Message(models.Model): sender = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='sender_notification') recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='recipient_notification') message = models.TextField() read = models.BooleanField(default=False) recieved_date = models.DateTimeField(auto_now_add=True) 模型:

recipient

如果我没有记错的话,User / MessageMessage之间的关系是一对多,因为单{{1} 1}}记录只能有一个recipient,但User可能在Message表中有很多记录。但是,在某些情况下,我希望将相同的Message发送到多个Users。使用我当前的架构,我可以添加多个Message记录,每个收件人一个,具有相同的message文本。但是,这似乎有很多重复。在这种情况下,我的关系会像多对多的关系更有意义吗?

最初我认为重复(多个Messages具有相同的message字段但不同的recipient字段)是一个坏主意,但我想的越多,它就像建模多对多关系实际上会更加困难,并且需要更多数据。每个Message记录都有一个read字段,用于指示收件人是否已阅读该邮件。如果我有一个Message条记录包含多个recipients,那么我似乎需要另一个表来跟踪已经阅读过邮件的收件人。这意味着如果我想向每个用户发送消息,我将需要向Message表添加一行,但是必须为每个收件人的“读取记录”表添加一行。因此,我不仅创建了更多的行总数(1 Message,并且每个用户都有一个读取记录,而不是n个用户的n Message),我还要为其添加一个额外的表。混合

我已经做了很多次搜索,试图确定一个表有多行的表是否更好,或者多行表的行数更少,看起来没有明确的答案;相反,它取决于您的数据和要求。我只是在寻找对我的具体情况的最佳方向的一些见解,但我也对将来可能遵循的任何一般规则感兴趣,如果这种情况存在这样的规则。

我非常愿意为自己预先做更多工作,以“正确”的方式做事(如果在这种情况下有这样的事情),如果这是必要的话。谢谢!

1 个答案:

答案 0 :(得分:3)

使用" read"解决问题的方法多个用户的标志是使用自定义直通模型的多对多,并将该标志放在那里:

class UserMessage(models.Model):
    read = models.BooleanField()
    user = models.ForeignKey(User...)
    message = models.ForeignKey(Message...)

class Message(models.Model):
    user = models.ManyToManyField(User, through=UserMessage)

现在每个用户都有一个个人"阅读"每条消息的字段,无论有多少用户也阅读该消息。根据用户和消息,您可以使用UserMessage.objects.get(user=user, message=message)获得中间模型。