【发布时间】:2011-01-15 05:24:24
【问题描述】:
假设我们有一个受欢迎的网站。我们需要在用户之间实现类似邮件的消息传递。 典型的解决方案是使用 2 个表:
用户(user_id)
消息(message_id、sender_id(引用 user_id)、receiver_id(引用 user_id)、主题、正文)。
这种方法有两个明显的局限性
- 所有用户的所有消息都存储在一个表中,导致其负载很高并降低了整体数据库性能。
- 当有人需要同时向多个用户发送消息时,消息会被复制 (recipients_count) 次。
另一种解决方案使用 3 个表:
用户(user_id)
Sent_messages(sent_id, sender_id (references user_id), subject, body)
Received_messages(sent_id、receiver_id(引用 user_id)、主题、正文)
received_messages 的主题和正文是从 sent_messages 的相应字段复制而来的。
这种方法导致
- 通过将信息从一个表复制到另一个表来非规范化数据库
- 用户实际上可以删除已发送/已接收的消息,而无需将其从接收者/发送者中删除。
- 消息占用大约 2 倍以上的空间
- 每个表的加载量大约减少了 2 倍。
那么问题来了:
- 哪种设计更适合高负载和可扩展性? (我认为是第二个)
- 是否有另一种可以处理高负载的数据库设计?它是什么?有什么限制?
谢谢!
附:我知道在解决这些可扩展性问题之前,网站必须非常成功,但我想知道如果需要该怎么做。
更新
目前,对于第一个版本,我将使用 Daniel Vassallo 提出的设计。但是如果以后一切都OK的话,设计就改成第二个了。感谢 Evert 减轻了我对此的担忧。
【问题讨论】:
标签: sql mysql database database-design scalability