每个客户的一个模式是什么或分离Schema?

时间:2009-03-06 03:16:49

标签: database-design

让我们假设您构建了一个需要为多个客户提供服务的应用程序(数据永远不会在客户之间共享),而客户数据本身也是敏感的。

您如何设计数据库以防止来自一个客户的突然(例如错误)数据对另一个客户可见?

E.g。我们有一个项目表,其中包含客户的项目。现在我们可以将所有项目(所有客户)放入该表中,或者为每个客户创建一个模式。

我喜欢模式分离的想法(因为它会完全分离数据)但是因为我从未这样做过,所以我不确定这是否是一种好方法(例如,更改模式需要维护所有客户方案) 。

重要提示:应用程序包含所有客户共享的主数据(例如客户帐户,设置,模板等)。所以我期望的另一个缺点是同时维护多个连接......

更新:是否可以自动复制架构?

5 个答案:

答案 0 :(得分:2)

要正确加权选项,我认为您需要分析应用程序代码的质量。我已经为大客户构建了许多系统,这些系统可以很好地共享数据库,而我们从未对交叉共享数据有任何担忧。如果您拥有授权逻辑安全的高质量代码,那么我将始终使用一个模式;维护就这么容易了

另一方面。如果你拼凑了没有业务对象库的asp页面,没有标准和集中授权逻辑;然后肯定会使用不同的数据库,每个客户都有唯一的登录信息。

答案 1 :(得分:0)

我认为将每个客户分开的想法是最好的选择。您的主数据可以自行保存,只要客户端不访问该表(或至少经常访问它)就可以。关键在于分离所有客户的敏感数据,同意这将导致更多的工作。但是,嘿,这就是你扩展业务所得到的。

答案 2 :(得分:0)

根据您的要求,单独的客户数据库架构的声音就像一个好主意。这会有点头疼,但不像诉讼那么多。

答案 3 :(得分:0)

您可以改为创建一个主表,并为每个客户提供一个视图。然后,所有查询都将通过此视图,这将过滤掉相关客户之外的所有内容。

这使维护变得简单,因为视图只定义了一个约束(在客户上),并且不包含任何其他模式信息。

以下是MySQL中的一个示例(不是最好的视图数据库,但是嘿)

CREATE VIEW projects.foocust AS SELECT * FROM projects WHERE customer = 'foocust';

答案 4 :(得分:0)

我的建议是尽可能地为每个客户分开数据。使用SQL Server我会将每个客户的数据存储在一个单独的数据库中(您可以在SQL Server实例中拥有许多单独的数据库)。如果您没有该选项,则架构可以执行非常类似的操作。