【问题标题】:Best way to structure a database for scaling构建用于扩展的数据库的最佳方法
【发布时间】:2011-10-25 05:06:20
【问题描述】:

我正在开展一个项目,该项目有可能拥有大量用户,每个用户都将管理自己独特的数据集。我认为数据可以以两种方式之一存储。

1) 为每个用户创建一个完全不同的数据库,以便他们的数据与其他人完全分开

2) 共享同一数据库中的数据,并在查询级别使用 user_id 字段将其隔离。

每个用户的架构总是相同的。

主要是系统需要能够扩展,我不确定是否拥有数千个不同的数据库,或者在同一个表中存储数百万条记录是否会更好地扩展。

我很想听听过去处理过这种情况的任何人的意见,以及任何一种选择可能存在哪些陷阱。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    除了您已经确定的扩展方面,还有一些其他问题可能会促使您做出决定 - “大量用户”也可能意味着您最好澄清的数字范围。

    其他运营问题:

    • 安全性 - 依赖代码中的 user_id 字段依赖于不存在允许用户查看/操作其他用户数据的错误或缺陷。

    • 升级 - 双向升级,但您可以一次升级每个人(单个数据库)或拆分 - 允许自己在不同时间升级不同的用户集。

    • 备份/恢复 - 根据恢复要求和 SLA,您可能会发现在备份/恢复方面让每个人都在一个数据库中会产生太多问题。如果单个客户端想要恢复他们的数据,当它与所有其他客户端的数据结合时的操作开销并不是微不足道的。同样,拥有大量数据库 = 大量单独备份。

    • 可扩展性 - 能够将不同用户的数据库放置在单独的服务器上有助于扩展,而不需要大型的铁数据库服务器。但同样,这是管理开销。

    应用程序的多租户及其数据源不是一个简单的问题/答案 - 更多地了解在这种情况下有多少用户是“大”的,并结合运营问题为您提供指导。

    【讨论】:

    • * 我相当有信心可以处理任一选项的安全性。 *我可以看到升级的任何一种方式的优势,但我认为无论选择哪种数据模型,我都会一次升级所有人。 * 无论使用什么数据模型,我都认为备份具有优势/劣势。我可以看到这两种方法的利弊。这对我来说纯粹是一个可扩展性问题。
    • 操作限制,尤其是在升级/备份/恢复方面,如果没有计划的话,可能会很麻烦。如果没有所有信息,实际上不可能提出“正确”的答案 - 或者 100% 确定 SO 领域的解决方案。
    • 您可以使用任何一种机制进行扩展,一些最大的数据以分片/map reduce 样式保存,同样,数十亿行数据集存在于单个数据库服务器上(硬件并不便宜)。
    【解决方案2】:

    选项 2 应该是您的最佳选择。数据库通常设计用于处理数百万行和大量数据。因此,只要您正确设计架构并具有适当的索引、填充因子等,选项 2 将引导您实现所需的缩放。正如 DarthVader 所说,了解有关数据库设计的更多信息。

    【讨论】:

      【解决方案3】:

      不要为每个用户创建单独的数据库。这不好。

      如果你有百万用户怎么办?

      为属于同一上下文的用户和实体创建表。你不能像那样扩展应用程序。在了解可扩展性之前。您需要了解数据库设计以及数据库的工作原理。

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 2017-03-14
        • 2016-04-03
        • 2019-09-21
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        相关资源
        最近更新 更多