主键上的多租户联合

时间:2013-07-18 14:20:52

标签: entity-framework multi-tenant composite-primary-key clustered-index sql-azure-federations

问题:

对于多租户单一共享数据库 - 是否应将tenantid字段包含在主键中(这将为应用表创建组合键),然后是聚簇索引,或者tenantid是否可以包含在聚簇索引中而不是主键的一部分 - 支持未来的azure联合可能性?


/背景:

我不想制作主键的联合(tenantid)部分,因为我将使用EF5(甚至发布的版本)和OData与Web API,我的理解是在EF和OData中工作使用复合键会使库变得更加困难

我没有明确地读取我需要在哪里创建主键的联合键部分 - 仅复合键

我不需要联邦开始,但如果我需要扩展,我想要选择。

注意,我将仅使用GUID,因为联合会不接受Identity列作为主键(另一个长话题,与此问题无关)


实施例

表:承租人 主键:TenantID(GUID) 聚集索引:TenantID

使用:

表:客户 主键:CustomerID(GUID) 外键:TenantID(GUID) 聚集索引:客户,TenantID

或者:

表:客户 主键:客户,租户(复合主键)(GUID) 外键:TenantID(GUID) 聚集索引:客户,TenantID


参考:

以下是Windows Azure Federation Guidelines and Limitations ...

的摘录

联合表具有以下限制: 联合表的联合列只能包含确认联合成员range_low包含和range_high独占的数据。

联合列的数据类型必须与联合定义中定义的数据类型完全匹配。

联合表上的所有唯一索引和聚簇索引都必须包含联合列。 联合列在索引中的显示顺序可能与联合中的键序号不同。

联合列值无法更新为联合成员范围之外的值。

联合列不能是持久性或非持久性计算列。

联盟成员不支持索引视图。

联合列不能为NULL。

联合表上的所有外键约束都需要在外键中相同序号的referrer和引用表上包含联合列。引用表不能与联合表具有外键关系。联合表可以没有限制地与引用表具有外键关系。

您可以正常删除使用FEDERATED ON子句创建的表。您还可以使用ALTER TABLE更改联合表的所有属性,但联合属性(例如联合密钥)除外。要将引用表更改为联合表或联合表更改为引用表,必须创建具有所需属性的新表并删除现有表。

当表标记为STATISTICS_NORECOMPUTE时,SPLIT等联合操作不会使统计信息无效或重新计算。在重新分区SPLIT等操作后,这可能会导致执行计划问题。

联盟成员不支持身份属性

联合成员不支持时间戳和rowversion数据类型。

1 个答案:

答案 0 :(得分:2)

恕我直言,使用Tenantid是应用程序的内部,以识别基于租户的数据。以下就足够了

  

表:客户主键:CustomerID(GUID)外键:   TenantID(GUID)聚集索引:Customer,TenantID

我没有看到任何有效的原因让tenantid成为复合主键的一部分。此外,通过联合,我们只识别租户及其数据。

因此,您可以将TenantId作为外键/索引。请分享您的想法。