Mysql Django数据库模型-邮件和收件人:多对多还是多对一?
我的数据库使用MySQL,在Django应用程序中有以下Mysql Django数据库模型-邮件和收件人:多对多还是多对一?,mysql,django,database,django-models,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_nam
消息模型:
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)
如果我没有弄错的话,这样一来,收件人
/用户
和消息
之间的关系是一对多,因为单个消息
记录只能有一个收件人
,但是用户
可能在消息
表中有许多记录。但是,在某些情况下,我希望向多个用户发送相同的消息
。使用我当前的模式,我可以添加多条消息
记录,每个收件人一条记录,并且具有相同的消息
文本。然而,这似乎有很多重复。在这种情况下,作为多对多关系,我的关系是否更有意义
起初我认为复制(多个消息
具有相同的消息
字段,但不同的收件人
字段)是个坏主意,但我越想越想,似乎建模多对多关系实际上就越困难,需要更多数据。每个邮件
记录都有一个读取
字段,用于指示收件人是否已阅读邮件。如果我有一条包含多个收件人的邮件
记录
,那么我似乎需要另一个表来跟踪阅读和未阅读邮件的收件人。这意味着,如果我想向每个用户发送消息,我需要向消息
表中添加一行,但必须为每个收件人向“读取记录”表中添加一行。因此,我不仅总共创建了更多的行(1Message
,n个用户各有一条读取记录,而n个用户有nMessage
s),我还向混合添加了一个额外的表
我做了很多搜索,试图确定是一个多行的表更好,还是多个少行的表更好,但似乎没有确定的答案;相反,这取决于您的数据和需求。我只是想了解在我的特殊情况下的最佳方向,但我也对未来可能遵循的一般规则感兴趣,如果这种情况下存在此类规则的话
我非常愿意为自己做更多的前期工作,以便以“正确”的方式做事(如果在这种情况下有这样的事情),如果这恰好是必要的话。谢谢大家! 解决多用户“读取”标志问题的一种方法是使用多对多自定义直通模型,并将该标志放在那里:
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)
获得中间模型解决多用户“读取”标志问题的一种方法是使用多对多自定义直通模型,并将该标志放在那里:
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)
获得中间模型,这非常有趣。这是一个非常有用的模式,我不知道!然而,我仍然很好奇,如果我有一条消息要发送给10个用户,那么创建一条消息和10条UserMessage
s与使用我问题中的示例模型和创建10条消息
s(每个消息都有不同的收件人)相比,是否有优势?我在使用当前方法时遇到的一个缺点是,我无法通过默认的管理界面一次向多个用户发送消息(因为我只能选择一个收件人
),但这是一个我可以忍受的缺点。还有其他人吗?我现在正在尝试这种方法,一旦我确认它对我有效,我就会接受这个答案。但是请稍微更新一下您的代码示例:Message
需要首先定义,以避免在UserMessage
上引用Message
的Message
字段中引发namererror
,并且through
参数需要是字符串(同样,为了避免引发namererror
). 非常感谢。非常有趣。这是一个非常有用的模式,我不知道!然而,我仍然很好奇,如果我有一条消息要发送给10个用户,那么创建一条消息和10条UserMessage
s与使用我问题中的示例模型和创建10条消息
s(每个消息都有不同的收件人)相比,是否有优势?我在使用当前方法时遇到的一个缺点是,我无法通过默认的管理界面一次向多个用户发送消息(因为我只能选择一个收件人
),但这是一个我可以忍受的缺点。还有其他人吗?我现在正在尝试这种方法,一旦我确认它对我有效,我就会接受这个答案。但是请稍微更新一下您的代码示例:Message
需要首先定义,以避免在UserMessage
上引用Message
的Message
字段中引发namererror
,并且through
参数需要是字符串(同样,为了避免引发namererror
). 非常感谢。