行级别的单个数据库中的物理数据分离

时间:2013-02-08 08:52:44

标签: sql-server database database-design multi-tenant

问题:

假设我们有5个客户。目前,每个客户端都拥有自己的数据库副本。这是因为有数百万行,我们不希望加载一个客户端的数据库来干扰另一个客户端数据库的性能。

这不是最佳设计,因为:

  • 管理每个客户端的单独连接不灵活,
  • 需要在多个数据库中传播更改,
  • 需要为每个新客户创建一个新数据库。

问题:

是否可以将所有这些数据包含在一个数据库中,但在客户端数据之间具有某种形式的物理隔离,以便它具有与具有多个数据库类似的功能?

此隔离不会在表(或架构)级别,而是在行级别更多。例如,我不希望每个客户端都有单独的Employee表(例如Employee_ClientAEmployee_ClientBEmployee_ClientC),而是Employee表使用ClientID外键。这意味着表中的数据需要在物理上分开。

2 个答案:

答案 0 :(得分:3)

如果您主要考虑性能问题,则可以使用Partitioned Tables功能将单独的客户端数据放在单独的文件组中。

如果您想限制每个客户对其他客户数据的可见性,您可以考虑Granting Row-Level Permissions in SQL Server

中列出的选项

答案 1 :(得分:1)

您的问题与多租户数据库架构有关。我为你添加了多租户标签。在进行更改之前,您可能需要单击它并阅读其他一些多租户问题和答案。 This SO answer总结了大部分权衡,并链接到微软的一篇文章。

  

是否可以将所有这些数据都包含在一个数据库中但具有   客户端数据之间的某种形式的物理隔离使它成为可能   与几个数据库的执行方式类似吗?

不,不是真的。 物理隔离意味着每个客户端必须拥有自己的数据库或自己的架构。

  

而是一个带有ClientID外键的Employee表。这意味着   表中的数据需要在物理上分开。

在所有客户端之间共享一个表,并通过其client_id隔离每个客户端的行不是物理隔离。这是逻辑隔离。为特定客户端选择行取决于在WHERE子句中使用其client_id。

您将无法在同一硬件上获得类似的性能,因为每个表将包含原始表的行数的五倍,并且每个查询都必须在WHERE中包含“client_id”条款。您可能在少数客户端和几行中获得类似的性能,但随着数据库的增长,差异将变得更加明显。