我有一个场景,我的应用程序是一个基于 SAAS 的应用程序,可满足多个客户的需求。对客户的数据完整性非常重要。
保留我的桌子更好吗
- 客户特定或
- 关系表
例如:我有一个包含字段 MapField1、MapField2 的映射表。我需要为每个客户提供这种数据。
我应该有像 MappingData_ 这样的表吗
或映射到 ClientId 的单个表
具有字段 MapField1、MapField2、ClientId 的 MappingData
我有一个场景,我的应用程序是一个基于 SAAS 的应用程序,可满足多个客户的需求。对客户的数据完整性非常重要。
保留我的桌子更好吗
例如:我有一个包含字段 MapField1、MapField2 的映射表。我需要为每个客户提供这种数据。
我应该有像 MappingData_ 这样的表吗
或映射到 ClientId 的单个表
具有字段 MapField1、MapField2、ClientId 的 MappingData
我将为每个客户建立一个单独的数据库。 (单个 SQL Server 实例中的多个数据库。)
这将允许您使用单个架构设计一次。
如果需要全局共享数据,那将进入另一个数据库,它拥有针对不同 SQL 登录名的一组权限。
使用包含所有用户的单个数据库是我的下一个最佳选择。您仍然有一个模式。但是您无法对客户的数据进行分区,您需要自己管理访问权限和权限,以及大量其他额外的设计和测试工作。
我永远不会为其他客户动态创建新表。一个新的表名意味着您的所有查询都需要使用新的表名进行更新,以及一大堆其他维护难题。
我的观点是,如果您想在应用程序/服务的正常使用期间动态创建表,那么您的设计就很糟糕。
SO有一个你所描述的东西的标签:“多租户”。
将支持多租户数据库应用程序的架构可视化为频谱。频谱的一个极端是“无共享”,这意味着每个租户都有自己的数据库。在频谱的另一个极端是“共享一切”,这意味着租户共享表,每个表中的每一行都属于一个租户。(每行包含一个租户标识符。)
术语似乎重叠,因此请仔细阅读。一位作者所说的共享模式可能与另一位作者所说的共享所有内容相同。
这个 SO answer也是由我编写的,描述了成本、数据隔离和保护、维护和灾难恢复方面的差异和权衡。它还链接到一篇相当不错的介绍性文章。