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

我的数据库使用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)
如果我没有弄错的话,这样一来,
收件人
/
用户
消息
之间的关系是一对多,因为单个
消息
记录只能有一个
收件人
,但是
用户
可能在
消息
表中有许多记录。但是,在某些情况下,我希望向多个
用户发送相同的
消息
。使用我当前的模式,我可以添加多条
消息
记录,每个收件人一条记录,并且具有相同的
消息
文本。然而,这似乎有很多重复。在这种情况下,作为多对多关系,我的关系是否更有意义

起初我认为复制(多个
消息
具有相同的
消息
字段,但不同的
收件人
字段)是个坏主意,但我越想越想,似乎建模多对多关系实际上就越困难,需要更多数据。每个
邮件
记录都有一个
读取
字段,用于指示收件人是否已阅读邮件。如果我有一条包含多个
收件人的
邮件
记录
,那么我似乎需要另一个表来跟踪阅读和未阅读邮件的收件人。这意味着,如果我想向每个用户发送消息,我需要向
消息
表中添加一行,但必须为每个收件人向“读取记录”表中添加一行。因此,我不仅总共创建了更多的行(1
Message
,n个用户各有一条读取记录,而n个用户有n
Message
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
). 非常感谢。