2011-11-22 76 views
1

Ola,我正在将一个旧的国家/地区/位置数据库结构重构为分层表。保持HierarchyID是最新的

我将使用新表的主键和自参考PARENTID列(主键)作为一个HIERARCHYID列的基础。因此

我的表如下所示:

PK名称PARENTID HIERARCHYID

1世界NULL/

2英国1/1/

3维冈2/1/2

我的问题是:当创建记录或记录的父项变更时,其他人实施了哪些方法来保持层次结构列的最新状态ED?

注意;我正在使用LINQtoSQL(我使用计算的hierarchyid.ToString()列来暴露代码中的沿袭,加上存储过程给我hierarchyid查询的性能好处)。

对于插入/更新管理:

我已经考虑覆盖在LINQtoSQL插入/更新程序为我的新表。

我已经考虑使用存储过程来管理更新/插入新记录。

在插入/更新以基于ParentID执行更新后,我考虑了递归触发器。

我还没有做出决定哪个课程!

有没有人使用这些方法来管理hierarchyids?有没有更好的方法,我没有考虑过,或者我错过了真正明显的东西!!??

回答

1

我刚刚做了一个类似的项目,我用存储过程来处理id管理。如果你正在做一些简单的查询,LINQ很酷,但是它在调试和维护数据模型时会带来困难。

好部分有关使用存储的过程,就是它抽象从应用层的ID的管理,使得开发人员不需要了解底层数据库模型(一个或多个)。同样,在糟糕的一面,它会从应用程序层中抽象出id管理,这样开发人员就无法理解底层数据库模型,而无需进入数据库并查看存储的proc。

使用数据库触发器可能是最好的解决方案,但我决定不去那样做,因为它会增加另一个抽象层次。这是因为它进一步混淆了真实的数据流程,留下了另一个地方寻找可能试图弄清楚它是如何工作的人。

底线是,你应该强制执行的方式,是在你的系统是一致的(或您的项目,至少是)你的引用完整性。

+0

感谢您的建议,我会坚持我认为的一个问题。我有一个RefreshLocationHierarchy sproc,它使用一个hierarchyid重新加载整个表的数据。这将在所有更新和插入之后调用(这不会那么频繁)。 – Oliver