多租户数据架构

时间:2013-12-09 16:21:48

标签: sql sql-server asp.net-mvc database-design multi-tenant

目前正致力于预订管理系统。这是一个多租户申请,将有大约50个租户。

我们计划在某些托管服务提供商(如winasp.net等)中托管此ASP.Net MVC4/SQL Server 2008应用程序(尚待决定)

Business Model Diagram

enter image description here

上面的图片中描述了超级管理员,租户管理员,客户服务,医生等多个级别的用户。

为了实现这个数据库模型,我们选择MSDN Multitenant Data Architecture中提到的Shared Database with Shared Schema方法

我们添加了一列TenantId in each table

我们的共享数据库&共享模式决策基于以下

  1. 没有租户(50 +)

  2. 轻松分享租户之间的常见元数据

  3. 如果租户拥有更多的数据,则将大租户(一个/两个)移动到单独的实例

  4. 我们现在正在进行中,我们仍然害怕解决以下问题

    1. 数据安全 - >每次都需要通过/检查TenantId

    2. 单个租户的备份 - >需要为备份编写SQL查询并考虑外键/自动增量是备份的头痛

    3. 数据量。单个数据库存储所有租户数据,查询数据很慢

    4. 索引(不确定我们是否需要索引每个表中的所有TenantId列,因为它涉及所有WHERE

    5. 还有其他选项,如

      • 单个数据库/租户
      • 共享数据库,单独的架构

      同样This Article增加了一些方法

      我们希望为我们当前的设计提供一些建议/更好的设计。

      • 新方法符合上述业务图

      • 租户管理员/客户服务用户必须能够查看子租户记录

      • 查询执行情况

      • 租户之间的共同元数据共享

      • 租户特定元数据

      • 租户特定数据字段(可选)

      • 轻松备份

1 个答案:

答案 0 :(得分:2)

在我看来,您应该重新考虑拥有共享数据库的决定。如果您因为机密性而需要严格的数据分离,那么您应该拥有单独的数据库。

  

索引(不确定我们是否需要索引每个表中的所有TenantId列,
   因为它涉及所有WHERE

是的,您必须在每个表中对TenantId编制索引并将其包含在所有查询中。

此外,在分析需求之前,您似乎已经决定使用SQL Server。存储多租户数据可能有更自然的解决方案,即。 RavenDB,它将使分片/备份更加简单。我不想开始讨论nosql等等 - 只是建议一个人应该从需求开始,然后选择合适的技术。