2013-02-08 53 views
0

问题:物理数据分离

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

这不是一个最佳的设计,因为:

  • 管理为每个客户单独的连接不灵活,
  • 变化需要跨多个数据库进行传播,并
  • 一个新的数据库需要为每个新客户创建。

问:

是否有可能包括所有的数据到一个数据库中,但有某种形式的客户端数据之间的物理隔离,以便它也执行具有几个数据库?

这种隔离不是在表(或模式)级别,而是在行级别。例如,我不希望每个客户端都有单独的Employee表(如Employee_ClientA,Employee_ClientB,Employee_ClientC),而是一个Employee表和ClientID外键。这意味着表格中的数据需要物理分离。

回答

1

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

是否有可能包括所有的数据到一个数据库中,但有 某种形式的客户端数据之间的物理隔离,使其 执行同样有几个数据库?

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

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

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

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

3

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

如果要限制每个客户端的数据其他客户的可见性,你可能会考虑在Granting Row-Level Permissions in SQL Server

+0

将这些表分区到单独的物理硬盘上的文件组是否有意义? – davenewza

+0

这个*可能*为OP,谁在谈论5个客户。但是这种分区技术是一种奇特的用途,它被设计用于扩展,而不是作为多租户架构的核心结构组件。在更一般的情况下这是不实际的。不支持x86硬件上超过1000个分区,默认限制是15000个分区(在具有16个RAM的服务器上)。 –