我正在使用 SQL Server 2008 / LinqToSQL / 定制存储库作为 DAL 开发一个多用户 Internet 数据库驱动的网站。我遇到了一个规范化问题,如果利用得当,可能会导致数据库状态不一致,我想知道如何处理这个问题。
问题:几家不同的公司可以访问我的网站。他们应该能够在我的网站上跟踪他们的项目和客户。一些(但不是全部)项目应该可以分配给客户。
这将产生以下数据库架构:
**Companies:**
ID
CompanyName
**Clients:**
ID
CompanyID (not nullable)
FirstName
LastName
**Projects:**
ID
CompanyID (not nullable)
ClientID (nullable)
ProjectName
这导致以下关系:
Companies-Clients (1:n)
Companies-Projects (1:n)
Clients-Projects(1:n)
现在,如果用户是恶意的,他可能会插入一个项目,该项目具有他自己的 CompanyID,但其 ClientID 属于另一个用户,从而使数据库处于不一致状态。
这个问题在我的数据库模式中以类似的方式出现,所以如果可能的话,我想以一种通用的方式解决这个问题。我有以下两个想法:
检查可能导致 DAL 不一致的数据库写入。这将是通用的,但在执行更新和创建查询之前需要一些额外的数据库查询,因此会导致性能下降。
为 clients-Projects 关系创建一个附加表,并确保以这种方式创建的关系是一致的。这也需要一些额外的选择查询,但比第一种情况要少得多。另一方面,它不是通用的,因此从长远来看更容易遗漏某些东西,尤其是在向数据库添加更多表/依赖项时。
你会怎么办?我错过了更好的解决方案吗?
编辑:您可能想知道为什么 Projects 表有 CompanyID。这是因为我希望用户能够添加有和没有客户的项目。我需要跟踪无客户端项目属于哪个公司(以及哪个网站用户),这就是项目需要 CompanyID 的原因。