我在我的数据库中使用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
/ Message
和Message
之间的关系是一对多,因为单{{1} 1}}记录只能有一个recipient
,但User
可能在Message
表中有很多记录。但是,在某些情况下,我希望将相同的Message
发送到多个Users
。使用我当前的架构,我可以添加多个Message
记录,每个收件人一个,具有相同的message
文本。但是,这似乎有很多重复。在这种情况下,我的关系会像多对多的关系更有意义吗?
最初我认为重复(多个Messages
具有相同的message
字段但不同的recipient
字段)是一个坏主意,但我想的越多,它就像建模多对多关系实际上会更加困难,并且需要更多数据。每个Message
记录都有一个read
字段,用于指示收件人是否已阅读该邮件。如果我有一个Message
条记录包含多个recipients
,那么我似乎需要另一个表来跟踪已经阅读过邮件的收件人。这意味着如果我想向每个用户发送消息,我将需要向Message
表添加一行,但是必须为每个收件人的“读取记录”表添加一行。因此,我不仅创建了更多的行总数(1 Message
,并且每个用户都有一个读取记录,而不是n个用户的n Message
),我还要为其添加一个额外的表。混合
我已经做了很多次搜索,试图确定一个表有多行的表是否更好,或者多行表的行数更少,看起来没有明确的答案;相反,它取决于您的数据和要求。我只是在寻找对我的具体情况的最佳方向的一些见解,但我也对将来可能遵循的任何一般规则感兴趣,如果这种情况存在这样的规则。
我非常愿意为自己预先做更多工作,以“正确”的方式做事(如果在这种情况下有这样的事情),如果这是必要的话。谢谢!
答案 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)
获得中间模型。