我应该在多个数据库之间拆分数据还是将它们保存在一个数据库中?

时间:2009-12-15 23:58:59

标签: mysql database-design data-modeling multi-tenant

我正在用PHP创建一个多用户/公司Web应用程序。 MySQL的。我很想知道构建数据库的最佳实践是什么。

这个网络应用程序将有数百家公司和数千名用户,因此需要强大。每家公司都无法看到其他公司的数据,只有他们自己的数据。我们将主要存储文本数据,每个公司可能只有几MB。

目前,该数据库包含14个表(对于一个样本公司)。

将所有公司及其用户的数据放在一个数据库中并为每个公司创建一个唯一的公司ID是否更好?

或:

将每个公司的数据放在自己的数据库中并为我添加的每个新公司创建一个新的数据库和表集是不是更好?

每种方法的优点和缺点是什么?

谢谢,

斯蒂芬

4 个答案:

答案 0 :(得分:7)

如果所有不同的公司都使用单个Web应用程序,除非您有非常特殊的需要或理由使用单独的数据库(听起来不像您这样做),那么您绝对应该使用单个数据库。

您的应用程序将负责仅向正确的经过身份验证的用户显示正确的信息。

答案 1 :(得分:3)

多个数据库将成为维护的噩梦。对于每个新公司,您必须创建和管理每个公司。如果您对一个架构进行了更改,则必须对14 +。

进行更改

成千上万的用户和成千上万的应用程序根本不应该构成问题,只要您使用的是真正的数据库而不是Access或类似的东西。

答案 2 :(得分:2)

单个数据库是关系方式。从这个角度来看,一个方面是数据库收集有关数据库使用情况的统计数据并大量使用它。如果你把事情分开,那么你将会在自己的脚下开枪,因为统计数据将会分散。

答案 3 :(得分:2)

多租户

加号

  • 相对容易开发:只在一个地方更改数据库代码。
  • 让您轻松创建使用多个租户数据的查询。
  • 直接添加新租户:无需更改代码。
  • 如果您需要更改设计,将多租户转换为单租户设置很容易。

劣势

  • 如果编码草率,则租户之间的数据泄露风险。在某些情况下,Tenant view filters可以用来降低这种风险。此方法基于为不同的租户使用不同的数据库用户帐户。
  • 如果您违反了规范,所有租户都会受到影响。

单租户

加号

  • 如果您对不同的租户有非常的不同要求,则可以使用几种不同的数据库模型。这是使用单个租户设置的最佳情况。
  • 如果你编码很苛刻,租户之间几乎没有数据泄露的风险(租户 A 将无法访问租户 B 的数据)。此外,如果您通过拙劣的更新意外破坏了一个租户的架构,其他租户将不受影响。
  • 当您不需要在查询中考虑租户ID值时,减少SQL代码

劣势

  • 数据库模式往往会随着时间的推移而发生变化,通常会导致噩梦。使用数据库比较工具,您可以缓解此问题,但可能需要比较许多模式。
  • 在一个查询中包含来自多个数据库的数据通常很复杂,并且通常需要准备好的语句。
  • 开发很难,因为您需要对多个模式进行相同的更改。
  • 相同的数据库实体可以出现在具有不同ID键的许多数据库中,从而导致混淆。
  • 如果您需要更改设计,将单租户转换为多租户设置非常困难。