gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:06:45 25 4
gpt4 key购买 nike

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

用户 (user_id)

消息(message_id、sender_id(引用 user_id)、receiver_id(引用 user_id)、主题、正文)。

这个方法有两个明显的局限性

  1. 所有用户的所有消息都存储在一个表中,导致其高负载并降低整体数据库性能。
  2. 当某人需要同时向多个用户发送消息时,消息会被复制 (recipients_count) 次。

另一种解决方案使用 3 个表:

用户(user_id)

Sent_messages(sent_id, sender_id (references user_id), subject, body)

Received_messages(sent_id, receiver_id (references user_id), subject, body)

received_messages 的主题和正文是从 sent_messages 的相应字段复制的。

这个方法导致

  1. 通过将信息从一个表复制到另一个表来对数据库进行反规范化
  2. 用户实际上可以删除已发送/已接收的消息,而无需将它们从接收者/发送者中删除。
  3. 消息占用的空间大约是原来的 2 倍
  4. 每个表的加载量大约减少 2 倍。

下面是问题:

  1. 哪一种设计更适合高负载和可扩展性? (我认为是第二个)
  2. 是否有另一种数据库设计可以处理高负载?它是什么?有什么限制?

谢谢!

附言我知道在解决这些可扩展性问题之前,网站必须非常成功,但我想知道如果需要该怎么做。

更新

目前,对于第一个版本,我将使用 Daniel Vassallo 提出的设计。但如果以后一切正常,设计将改为第二种。感谢 Evert 消除了我对此的担忧。

最佳答案

在将邮件发送给多个收件人的情况下,您可能希望避免多次复制邮件正文。这是您可能要考虑的另一个选项:

  • users (user_id)

  • messages (message_id, sender_id, subject, body)

  • received_messages (message_id, user_id, address_mode, deleted)

这种模式可能更像推特而不是电子邮件,但它可能有一些优势。

规则是:

  • 一条消息只能由一个用户发送,在每条消息的 sender_id 中引用。
  • 每个收件人都将在 received_messages 表中定义。 address_mode 字段可以定义消息是直接发送给收件人,还是作为 CC,或者可能作为 BCC。该字段显然是可选的。
  • 收件人删除的消息将在 received_messages 表中标记已删除标志。
  • 转发和回复的消息需要使用新的 sender_id 重新创建。然后可以修改消息正文。

这些是一些优点:

  • 这比原始问题中提到的两个选项占用的空间更少,尤其是在用户通常将消息发送给多个收件人的情况下。
  • 更容易缓存消息表,因为消息永远不会重复。
  • 删除消息的收件人不会删除消息发送给该用户的信息。它将在 received_messages 表中简单地标记为“已删除”。
  • 而且您还会得到一个标准化模型。

对于大多数应用程序,如果您对上述模型使用乐观隔离级别,即使您期望消息以每秒几条的速率交换,也不应该出现性能问题。另一方面,如果您期望每秒有数百或数千条消息,那么考虑其他选项可能真的是这种情况。

关于sql - 可扩展的 MySQL 数据库,用于类似邮件的消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com