我正在使用SQL Server 2008/LinqToSQL /定制存储库作为DAL的多用户互联网数据库驱动的网站。我遇到了一个规范化问题,如果正确利用,会导致数据库状态不一致,我想知道如何处理这个问题。如何避免此数据库模式中的冲突数据?
问题:几个不同的公司有权访问我的网站。他们应该能够在我的网站上跟踪他们的项目和客户。一些(但不是全部)项目应该分配给客户。
这将导致以下数据库模式:
**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不一致的数据库写入。这是通用的,但在更新和创建查询之前需要额外的数据库查询,因此会导致性能下降。
为客户 - 项目关系创建一个附加表并确保以此方式创建的关系是一致的。这也需要一些额外的选择查询,但远低于第一种情况。另一方面,它不是通用的,所以从长远来看,更容易错过某些东西,尤其是在向数据库添加更多表/依赖项时。
你会做什么?我错过了更好的解决方案吗?
编辑:你可能想知道为什么Projects表有一个CompanyID。这是因为我希望用户能够使用和不使用客户端来添加项目。我需要跟踪哪个公司(以及哪个网站用户)属于无客户端项目,这就是为什么项目需要公司ID。
我认为重点在于,如果没有某种方法记录数据库中允许或不允许的内容,触发器无法确定实际上有效的数据是否有意义。 – ninesided 2009-08-05 08:25:50
正是。我可能会尝试在我的DAL中执行相同的操作,而不是使用触发器,但我需要为每个更新/插入/删除操作添加一些额外的select查询,这将导致我在上面提到的第一种可能的解决方案。 – 2009-08-05 08:37:19