数据库客户端特定表v / s关系表

时间:2012-11-17 09:35:17

标签: sql database relational-database multi-tenant

我有一个场景,我的应用程序是一个基于SAAS的应用程序,迎合多个客户。对客户的数据完整性非常重要。

保持我的桌子是否更好

  1. 客户特定 OR
  2. 关系表
  3. 对于Ex:我有一个带有MapField1,MapField2字段的映射表。我需要为每个客户提供这种数据。

    我应该有像MappingData _

    这样的表吗?

    或带有映射到ClientId

    的单个表

    MappingData与字段MapField1,MapField2,ClientId

2 个答案:

答案 0 :(得分:1)

我会为每位客户提供单独的 数据库 (单个SQL Server实例中的多个数据库。)

这将允许您使用单个架构设计一次。

  • 没有动态命名的表格会影响测试&发展
  • 可以在一个数据库中设计和测试升级和维护,然后推广到所有
  • 单个客户的数据可以非常简单地备份,恢复或删除
  • 在一个数据库中发现/利用的错误将不包含其他数据库的完整性
  • 可以使用SQL登录(无需重新发明轮子)来管理数据访问(读取 写入)

如果需要全局共享数据,那么它将存在于另一个数据库中,并且具有针对不同SQL登录的自己的一组权限。


使用单个数据库,其中包含所有用户是我的下一个最佳选择。您仍然只有一个架构。但是,您无法对客户数据进行分区,您需要自己管理访问权限和许多其他额外的设计和测试工作。


我会 从不 为附加客户动态创建新表。新的表名意味着您需要使用新的表名更新所有查询,以及其他一系列维护难题。

我非常认为,如果您想在 Business As Usual 使用应用程序/服务期间动态创建表,那么您的设计就会非常糟糕。

答案 1 :(得分:0)

SO有一个你正在描述的东西的标签:“多租户”。

将支持多租户数据库应用程序的架构可视化为频谱。频谱的一个极端是“无共享”,这意味着每个租户都有自己的数据库。在频谱的另一个极端是“共享一切”,这意味着租户共享表,每个表中的每一行属于一个租户。 (每行包含一个租户标识符。)

术语似乎重叠,所以请仔细阅读。 共享架构的作者所指的内容可能与共享所有内容的其他作者所指的相同。

我写的

This SO answer描述了在成本,数据隔离和保护,维护和灾难恢复方面的差异和权衡。它还链接到一篇相当不错的介绍性文章。