我有一个多租户数据库,客户端之间有严格的关键数据分离。在投入生产之前,我想知道我的方法是否有意义或可能导致问题(安全/性能/维护)。以下2个模型是典型场景:
public class Car
{
[Key, Column(Order=0)]
public int carId {get;set;}
[Key, Column(Order=1)]
public int clientId {get;set;}
...
public virtual ICollection<Component> components {get;set;}
}
public class Component
{
[Key, Column(Order=0)]
public int componentId {get;set;}
[Key, Column(Order=1)]
public int clientId {get;set;}
...
[ForeignKey("carId, clientId")]
public Car car {get;set;}
public int carId {get;set}
}
这样,每个模型都将clientId作为主键,强制它与.Find()一起使用,并强制它进入许多关系的连接表。这意味着存在相当多的冗余,并且当查询实际上非常安全地进行数据分离时会使用clientId。
将clientId强制为任何内容是否有意义,或者仅将其保留在父模型上会更好吗?
答案 0 :(得分:1)
我认为这是正确的方法。我们仅在专利表上设计了客户端,并且已经开始将其非规范化为各种子表。这意味着它可以在从子表驱动的查询中使用。它还允许我们按客户端对表进行分区。
答案 1 :(得分:1)
如果我正在设计这个,我会确保运行数据库的应用程序代码经过全面测试和高质量编写,而不是以这种方式添加冗余。
以这种方式添加冗余将使您的代码和数据库更难以管理,我想它也可能导致性能问题(我没有足够的细节来做出明确的声明,但它看起来像它)。