多租户数据库中的复合键

时间:2011-03-22 14:55:58

标签: database security multi-tenant

我正在设计一个纯多租户数据库(一个数据库,一个模式),我想在我的大多数表中保留一个Tenant_Id作为安全措施,以确保数据不会出错租客的手。看起来这需要每个表上都有一个复合键。

示例:

在单租户情况下,我会有一个主键:

Animal_Id (PK)  
Animal_Type  
Animal_Name  

在多租户情况下,我会为Tenant_Id添加另一个主键:

Animal_Id (PK)  
Tenant_Id (PK)  
Animal_Type  
Animal_Name  

在每个表中添加Tenant_Id列是否意味着我需要在每个表中都有一个复合键,或者是否有安全的方法来避免这种情况?复合键没关系,但如果可以,我想避免使用它们。

3 个答案:

答案 0 :(得分:5)

如果您的所有ID都是自动增量整数,则可以添加tenant_id这不是主键的一部分,只需在所有查询中检查它。

但是,这有几个副作用,您可能会或可能不会将其视为缺点:

  • 您可以在多对多链接表中链接来自不同租户的两个实体,FOREIGN KEY约束不会阻止您这样做(因为tenant_id是一个部分PRIMARY KEY
  • 您的用户可以通过ID
  • 评估其中有多少其他租户
  • 您必须另外将实体表加入到搜索中,这些搜索可能只能从多对多链接表中进行(以检查租户)

换句话说,如果你真的不喜欢实体的复合键,可以不用它们来设计数据库。

答案 1 :(得分:4)

除非你为每个客户重复另一个id(你可能有两个或更多的animal_id = 1),否则没有理由让它成为一个复合键。您只需添加该字段即可。这对我们有用。

答案 2 :(得分:1)

您真的需要支持具有相同ANIMAL_ID值的两个不同租户吗?无论您使用什么机制来生成看似合成的主键值,都应该能够生成跨租户唯一的值。向表中添加TENANT_ID列可能有意义,但将其添加到主键并不明显是有益的。