Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可扩展的MySQL数据库,用于类似邮件的消息传递_Sql_Mysql_Database_Database Design_Scalability - Fatal编程技术网

可扩展的MySQL数据库,用于类似邮件的消息传递

可扩展的MySQL数据库,用于类似邮件的消息传递,sql,mysql,database,database-design,scalability,Sql,Mysql,Database,Database Design,Scalability,假设我们有一个受欢迎的网站。我们需要在用户之间实现类似邮件的消息传递。 典型的解决方案是使用两个表: 用户(用户id) 消息(消息id、发送者id(参考用户id)、接收者id(参考用户id)、主题、正文) 这种方法有两个显著的局限性 所有用户的所有消息都存储在一个表中,这会导致该表的高负载并降低数据库的整体性能 当某人需要同时向多个用户发送邮件时,邮件会被复制(收件人计数)次 另一个解决方案使用3个表: 用户(用户id) 已发送邮件(已发送邮件id、发件人id(参考用户id)、主题、正文) 已收

假设我们有一个受欢迎的网站。我们需要在用户之间实现类似邮件的消息传递。 典型的解决方案是使用两个表:

用户(用户id)

消息(消息id、发送者id(参考用户id)、接收者id(参考用户id)、主题、正文)

这种方法有两个显著的局限性

  • 所有用户的所有消息都存储在一个表中,这会导致该表的高负载并降低数据库的整体性能
  • 当某人需要同时向多个用户发送邮件时,邮件会被复制(收件人计数)次
  • 另一个解决方案使用3个表:

    用户(用户id)

    已发送邮件(已发送邮件id、发件人id(参考用户id)、主题、正文)

    已收到的消息(已发送的\u id、接收者\u id(参考用户\u id)、主题、正文)

    接收的_消息的主题和正文从发送的_消息的相应字段复制

    这种方法会导致

  • 通过将信息从一个表复制到另一个表来反规范化数据库
  • 用户实际上可以删除已发送/已接收的邮件,而无需将其从收件人/发件人中删除
  • 消息占用的空间大约是原来的2倍
  • 每个表的加载量大约减少2倍
  • 下面是问题:

  • 哪种设计更适合高负载和可扩展性?(我想是第二个)
  • 是否有其他数据库设计可以处理高负载?这是怎么一回事?限制是什么
  • 谢谢

    另外,我知道在解决这些可伸缩性问题之前,网站必须非常成功,但我想知道如果需要的话该怎么做

    更新


    目前,对于第一个版本,我将使用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、主题、正文),所以这两个设计都比第一个设计好(在占用空间和表性能方面)。也许问题陈述必须是这样的:将所有消息存储在一个表中,还是将它们复制到两个表中更好?对绩效的影响有多大?