0

问题:

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

这不是最佳设计,因为:

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

问题:

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

这种隔离不会在表(或模式)级别,而是在行级别。例如,我不想Employee为每个客户端(如Employee_ClientA, Employee_ClientB, Employee_ClientC)创建单独的表,而是希望使用Employee带有ClientID外键的表。这意味着表内的数据需要在物理上分开。

4

2 回答 2

3

如果性能是您主要关心的问题,您可以使用分区表功能将单独的客户端数据放在单独的文件组中。

如果要限制每个客户端对其他客户端数据的可见性,可以考虑在 SQL Server 中授予行级权限中概述的选项

于 2013-02-08T09:43:18.727 回答
1

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

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

不,不是。物理隔离意味着每个客户端都必须有自己的数据库或自己的模式。

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

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

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

于 2013-02-09T11:57:18.823 回答