可扩展的MySQL数据库,用于类似邮件的消息传递
假设我们有一个受欢迎的网站。我们需要在用户之间实现类似邮件的消息传递。 典型的解决方案是使用两个表: 用户(用户id) 消息(消息id、发送者id(参考用户id)、接收者id(参考用户id)、主题、正文) 这种方法有两个显著的局限性可扩展的MySQL数据库,用于类似邮件的消息传递,sql,mysql,database,database-design,scalability,Sql,Mysql,Database,Database Design,Scalability,假设我们有一个受欢迎的网站。我们需要在用户之间实现类似邮件的消息传递。 典型的解决方案是使用两个表: 用户(用户id) 消息(消息id、发送者id(参考用户id)、接收者id(参考用户id)、主题、正文) 这种方法有两个显著的局限性 所有用户的所有消息都存储在一个表中,这会导致该表的高负载并降低数据库的整体性能 当某人需要同时向多个用户发送邮件时,邮件会被复制(收件人计数)次 另一个解决方案使用3个表: 用户(用户id) 已发送邮件(已发送邮件id、发件人id(参考用户id)、主题、正文) 已收
目前,对于第一个版本,我将使用Daniel Vassallo提出的设计。但如果将来一切正常,设计将改为第二个。感谢埃弗特减轻了我对它的担忧。一般来说,数据库大小不会太大。速度更重要
因此,我倾向于选择方案二。正如您所提到的,它使删除邮件等操作变得更加容易,我敢肯定这是一种非常常见的方法。如果邮件发送给多个收件人,您可能希望避免多次复制邮件正文。以下是您可能需要考虑的另一个选项:
- 用户(用户id)
- 消息(消息id、发送者id、主题、, (正文)
- 收到的消息(消息id、用户id、地址模式,已删除)
- 一封邮件只能由一个用户发送,每个邮件的发件人id中都有引用
- 每个收件人都将在received_messages表中定义。address_mode字段可以定义邮件是直接发送给收件人,还是作为抄送,或者可能作为密件抄送发送给收件人。此字段显然是可选的
- 收件人删除的邮件将在received_messages表中标记Deleted标志
- 转发和回复的邮件需要使用新的发件人id重新创建。然后可以修改邮件正文
- 这比原始问题中提到的两个选项占用更少的空间,特别是如果用户通常会向多个收件人发送消息
- 更容易缓存messages表,因为消息从不重复
- 删除邮件的收件人不会删除邮件发送给此用户的信息。它只会在received_messages表中标记为“deleted”
- 你也可以得到一个标准化的模型李>
对于大多数应用程序,如果您在上述模型中使用乐观隔离级别,则即使您希望消息以每秒几次的速率交换,也不会出现性能问题。另一方面,如果你希望每秒有成百上千的消息,那么可能会考虑其他选项。我也考虑过这个设计。实际上,在发布了这个问题之后,我(心理上:)修改了第一个设计为用户(用户id)消息(消息id、发送者id、接收者id、消息内容id)消息内容(消息内容id、主题、正文),所以这两个设计都比第一个设计好(在占用空间和表性能方面)。也许问题陈述必须是这样的:将所有消息存储在一个表中,还是将它们复制到两个表中更好?对绩效的影响有多大?