假设我们有一个受欢迎的网站.我们需要在用户之间实现类似邮件的消息传递.
典型的解决方案是使用2个表:
用户(user_id)
消息(message_id,sender_id(引用user_id),receiver_id(引用user_id),主题,正文).
该方法有2个显着的局限性
>所有用户的所有消息都存储在一个表中,导致其高负载并降低整体数据库性能.
>当有人需要同时向多个用户发送消息时,会复制该消息(recipients_count)次.
另一个解决方案使用3个表:
用户(USER_ID)
Sent_messages(sent_id,正文)
Received_messages(sent_id,正文)
received_messages的主题和正文从sent_messages的相应字段中复制.
这种方法导致
>通过将信息从一个表复制到另一个表来对数据库进行非规范化
>用户实际上可以删除发送/接收的消息,而无需从接收器/发送器中删除它们.
>消息占用的空间大约是2倍
>每张表的装载量减少约2倍.
所以这里提出问题:
>考虑到哪种设计更适合高负载和可扩展性? (我认为这是第二个)
>是否有其他数据库设计可以处理高负载?它是什么?有什么限制?
谢谢!
附:我知道在解决这些可扩展性问题之前,网站必须非常成功,但我想知道如果需要该怎么做.
UPDATE
目前,对于第一个版本,我将使用Daniel Vassallo提出的设计.但如果将来一切正常,设计将改为第二个.感谢Evert减轻了我的担忧.