【发布时间】:2014-04-11 17:52:05
【问题描述】:
这是一个很常见的问题,但我还没有找到我正在寻找的确切问题和答案。
我有一个表,它的 FK 指向它自己的 PK,以启用任意深度的层次结构,例如经典的 tblEmployee,它有一个列 Manager,它是一个具有 PK tblEmployee.EmployeeID 的 FK。
假设在我的应用中,用户
- 创建没有经理的新员工 Alice 和 Dave,因为他们是 CEO 和总裁。所以
tblEmployee.Manager对于这两条记录来说是 NULL。 - 创建新员工 Bob,Alice 作为经理。然后创建以 Bob 为经理的 Charles。他们的 Manager 字段包含
tblEmployee中另一条记录的主键值。 - 编辑 Alice 的员工记录,这意味着为 Dave 分配了她的经理(这很好),但意外地将 Alice 的经理设置为 Charles,他在树中 Alice 的下方两层。
现在该表位于循环引用而不是正确的树中。
在应用程序中确保步骤 3无法完成的最佳方法是什么?我只需要确保它会拒绝执行最后一次 SQL 更新,而是显示一些错误消息。
我并不挑剔它是 SQL Server 中的数据库约束(必须在 2008 年或 2012 年工作)还是我的 C# 应用程序的业务逻辑层中的某种验证例程。
【问题讨论】:
-
业务逻辑可能非常简单:一直寻找员工的经理,直到它为空,或者它是您已经在循环中遇到的员工。
-
您是否考虑过使用
hierarchyid来建模层次结构而不是指针模型?由于其对层次结构建模的不同方式的本质,您无法构建循环。
标签: c# sql sql-server circular-reference