数据库架构问题:每位客户1个表或所有客户1个唯一的表

时间:2018-11-11 05:19:08

标签: sql database-design product

我们需要知道哪种数据库体系结构更有意义以及为什么使用。

我们有一个将使用相同表结构的客户列表(例外情况很少)。

我们大约有1万个客户,每个人可能都拥有大约5万种产品。

每个客户对产品的处理可能并不相同,我们还希望提供一个计划,使客户可以通过API访问其数据。

我们的客户确实销售产品,并且他们的SQL表结构都包含诸如:

的列
  • Feed_ID
  • 产品ID
  • 产品说明
  • 价格
  • 重量
  • 等...

Feed_ID用于区分这些产品的来源,并且对每个客户都是唯一的-当然。

我们考虑过的三种关系表结构选择:

  1. 每个客户都有其自己的数据库,并且在该数据库中,每个产品Feed都有1个表

  2. 所有客户都托管在1个唯一的数据库中,在该数据库中,所有客户每个供稿都拥有1个表-在这种情况下,如果1个客户作为2个不同的产品供稿,则可以拥有2个表。

  3. 所有客户都托管在1个唯一的数据库下,但是,在第3个解决方案中,我们只有1个唯一的表托管所有客户的所有产品供稿。

您将使用哪种解决方案?为什么您认为选择的解决方案更好?

谢谢。

2 个答案:

答案 0 :(得分:3)

您还没有提供足够的信息。在几乎所有情况下(例外情况请参见下文),您希望为所有客户提供一组表。原因如下:

  • 性能。表的激增意味着数据分散在更多的数据页面中,因此您有很多部分填充的数据页面。数据库较大,处理速度较慢。
  • 编码效率。如果一个客户的表都具有不同的名称,则所有代码都是动态SQL。这很难维护。
  • 维护。当有成千上万的相似表时,添加列或索引非常困难。
  • 分析。当类似的数据通过表格传播时,很难回答诸如“哪个客户的产品最多?”之类的问题。
  • 安全性。与成千上万个表相比,授予对一组表的访问权限的错误倾向要小。

毫无疑问,我错过了一些原因。您会发现,拥有具有少量表的单个数据库几乎是不费吹灰之力。

在某些情况下可能需要单独的数据库。我想不出在单个数据库中为每个客户端使用单独的表的充分理由。

第一原因是安全性和隔离性。将数据存储在“物理上”独立的数据库中可能有商业或什至法律原因,以进一步降低一个客户端(意外地或通过黑客攻击)看到另一客户端数据的可能性。

另一个原因是客户有定制的解决方案。也就是说,有每个客户端的自定义项。我仍然倾向于尝试将其放入单个数据库解决方案中,但这可能是不可能的。

与此相关的是您打算在云和本地均支持的应用程序。在这种情况下,每个客户端使用单独的数据库可能会简化应用程序设计。

但是,通常,您会将数据存储在一个相当标准化的单个数据库中,每个实体只有一个表。

答案 1 :(得分:1)

我认为为每个客户提供单独的表(或理想的架构)并不是一个坏主意。除了您提到的好处外,这种方式还可以轻松扩展数据库,并且可以让客户完全控制他们的数据。

关于缺点:

  • 管理起来比较复杂,但也没有那么糟-您可以编写 创建列/表/索引/等的脚本您 不必手动进行。
  • 对1万张桌子进行分析将是一个挑战, 尽管将其与生产混合仍然不是最好的主意。 我将创建一个单独的数据库(或服务器)进行分析,并运行 一些通宵工作以更新报表。

此外,如果您的表将具有数亿行(10Kx50k?),则最好将其拆分为较小的块,而不管您选择哪种选项。如果不是按客户划分,则按地区或其他更大的群体划分(假设您在本地RDBMS上构建)