私人消息系统,大型单表与许多小表

时间:2010-03-01 22:01:22

标签: mysql database database-design

我正在考虑设计一个私人消息系统,我需要一些输入,基本上我有几个问题。我已经阅读了大部分相关问题,他们已经给了我一些想法。

我到目前为止所研究的所有基本消息系统都使用单个表来表示所有用户的消息。有了索引等,这种方法似乎没问题。

我想知道的是将用户消息拆分为单独的表是否有任何好处。因此,当创建新用户时,将创建一个新表(在相同或专用的消息数据库中),该表存储为该用户发送和接收的所有消息。

以这种方式处理事情会有什么陷阱/好处? 我用PHP编写代码需要编写的代码比第一个大表选项特别麻烦吗? 与大型工作台相比,大量小型工作台的最终结果是否会更加强大,无故障? 在大量并发用户的情况下,服务器的性能与处理一个大表和多个小表的比较如何?

对这些问题或其他意见的任何帮助将不胜感激。在重写PM模块之前,我正在为我的测试站点进行较小规模的设计,并希望对其进行优化。我可怜的人类大脑更容易处理单独的桌子,但计算机也不一定如此。

5 个答案:

答案 0 :(得分:5)

你只会感到头痛,因为要搬到很少的桌子上。数据库用于处理大量数据,让它做到这一点。

  • 您可能最终会在查询中使用动态表名称(SELECT * FROM $username WHERE ...),如果不是完全不可能的话,使存储过程和可能参数化查询等智能功能变得更加棘手。通常是一个非常糟糕的主意。

  • 尝试重写SELECT * FROM messages WHERE authorID = 1 ORDER BY date_posted DESC,但“消息”在1到30,000个不同的表之间。保持你的表关系一夫一妻制会使他们保持双向,更有用。

如果您认为表格大小确实存在问题,请设置“存档邮件”克隆表并定期移动旧版&在那里他们不会妨碍那些未读的消息。另请注意,大多数具有私人消息的论坛软件如何限制用户收件箱大小。在保持理智的同时,有几种方法可以解决问题。

答案 1 :(得分:2)

我在这里同意@MarkR - 最初,消息的一个表肯定是继续进行的。随着时间的推移,如果您最终得到一个非常大的表,那么您可以考虑如何对表进行分区以便最好地进行。这与我通常建议设计的方式背道而驰,但我们谈的是一个相当简单的表 - 而不是一个巨大的企业系统。

很久以前(SQL数据库的预先可用性)我构建了一个存储私人和公共消息的系统,我可以确认,一旦你将一个消息库逻辑实体分成多个,所以¹变得复杂得多;我怀疑每个文件的用户是否是正确的方法 - 与收益相比,开销将是巨大的。

避免自动增量[2] - 使用自然键对未来的可扩展性非常重要。设计好以确保您可以在不锁定的情况下插入和检索将更有益。

<小时/> ¹索引,穿线,搜索,清除/存档。

²如果您可以为数据找到一个自然键,那么自然键会更好,因为自动增量ID根本不描述数据,数据库擅长根据主键定位,因此自然主键可以改善事物。自动增量可能会导致分布式数据库出现问题;它还会在外部呈现时泄漏数据(查看注册的用户数量,只需创建一个新帐户并检查您的用户ID)。如果找不到自然键,则UUID(或GUID)可能仍然是更好的选择 - 假设数据库作为主键具有良好的支持。见When to use an auto-incremented primary key and when not to

答案 2 :(得分:1)

当有大量用户拥有少量消息时,每个用户创建一个表肯定无法很好地扩展。 MySQL处理表打开/关闭的方式,非常大量的表(比如说> 10k)变得非常低效,特别是在服务器启动和关闭时,以及尝试备份非事务性表。

但是,你提出问题的方式听起来像是过早优化的情况。让它先工作,然后解决性能问题。这始终是做事的正确方法。

一旦您的规模变得足够高,就必须进行分区/分片。但同时还有很多其他事情需要担心。先将它们排序:)

一个表是从RDBMS PoV开始的正确方法。我建议你使用它,直到你知道更好。

答案 3 :(得分:0)

如果您正在尝试避免锁定问题,则将大量数据拆分为较小的集合是有意义的:例如 - 锁定消息表 - 进行大选择或一次更新大量数据。在这种情况下,长时间运行的查询可能会阻止整个表格,每个人都需要等待...你应该问问自己这是否会发生在你的情况下?至少在我看来,消息传递系统似乎不会有这样的东西,因为所有信息都被推入表中或从相当小的集合中检索。如果这是一个以用户为中心的应用程序 - 例如,为单个用户获取所有消息非常容易和快速,同样也可以为一个或另一个特定用户创建新消息...除非你真的很大系统中的用户/消息数量。

将数据拆分成多个表也有一些缺点 - 您需要一种管理系统或逻辑如何拆分所有内容 - 为每个用户提供单独的表可以很快成长为数百或数千个表 - 这在我的意见,不是很好。因此,您可能需要一些其他标准来分割数据。如果您希望拆分逻辑是动态且易于调整的 - 您可能还需要以某种方式将其保存在DB中。如你所见,复杂性增长......

由于此类数据分片的优势在于可扩展性 - 一旦单台机器无法处理整个负载,您就可以轻松地将不同的数据集放在不同的机器上。

答案 4 :(得分:0)

这取决于您的邮件系统的工作方式。 是否存在功能问题? 它是否需要可扩展,因为应用程序可以容纳更多客户?

设计一个表将完美地处理一次性单个用户系统的小型消息。 但是,如果您正在考虑多个用户,并发消息传递系统,则应该拆分表

由于“锁定和锁定”以及数据冗余问题,建议将实时应用程序的数据模型“标准化”(拆分表)。

  1. 锁定政策因数据库供应商而异。如果您的表格有更新和更新同时按应用程序选择,“锁定”(页面级别,行级别,表级别取决于供应商)发布araise。一些不好的DB&amp;应用程序设计完全锁定表格,因此消息永远不会通过。

  2. 重新审核问题更加清晰。如果你只使用一个表,那么一些信息(比如用户。我猜一个用户可以发送多条消息)是重要的。

  3. 尝试谷歌“规范化”,“锁定”..