【发布时间】:2013-07-14 06:14:59
【问题描述】:
我有一个多租户数据库,在客户端之间进行严格和关键的数据分离。在将其投入生产之前,我想知道我的方法是否有意义或可能导致问题(安全/性能/维护)。以下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 强制放入任何内容是否有意义,或者仅将其保留在父模型上是否更好?
【问题讨论】:
-
clientId 作为主键?还是它的外键?
-
在上面的代码中,clientId 与实际的 id 属性形成了一个复合键。但这就是我正在努力解决的问题。将其包含在复合 PK 中并将其作为附加的“检查器”强制进入查询中,或者将其保留并仅在父模型上使用。尤其是安全是一个问题。我看不到未来的影响,因为我没有经验。
-
为什么不使用每个架构的租户?
-
这是桌面应用程序还是网站?客户端将如何连接到 SQL Server、用户/密码或 Windows 身份验证?
-
对不起,我错过了,这是一个 API。该数据库由 SimpleMembershipProvider 以及客户端的一般数据使用。我会排除每个模式的租户,因为服务的数据大小(每个客户端相对较小)和成本结构使得多租户方法更可行,在维护和部署方面也是如此。
标签: c# sql-server entity-framework database-design architecture