保持HierarchyID最新

3
我正在重构一个旧的国家/地区/位置数据库结构,以创建一个分层表。我打算使用新表的主键和自引用的ParentID列(在主键上)作为层次结构ID列的基础。
因此,我的表看起来像这样:
PK Name ParentID HierarchyID
1 World NULL /
2 UK 1 /1/
3 Wigan 2 /1/2
我的问题是:其他人在创建记录或更改记录的父项时如何保持层次结构ID列的最新状态?
注意:我正在使用LINQtoSQL(我使用计算的hierarchyid.ToString()列在代码中公开血统,以及存储过程为我提供hierarchyid查询的性能优势)。
对于插入/更新管理:
我考虑重写LINQtoSQL中新表的插入/更新过程。
我考虑使用存储过程来管理更新/插入新记录。
我考虑在插入/更新后使用递归触发器来执行基于ParentID的更新。
然而,我还没有决定采取哪种方式!
有人使用过这些方法来管理层次结构ID吗?是否有更好的方法我没有考虑到,或者我漏掉了什么非常明显的东西!!?
1个回答

3

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

使用存储过程的好处是,它将id管理从应用层抽象出来,这样开发人员不需要了解底层的数据库模型。同样,不好的一面是,它将id管理从应用层抽象出来,这样开发人员就不能理解底层的数据库模型,除非他们去查看存储过程。

使用数据库触发器可能是最好的解决方案,但我决定不采用它,因为这样会增加另一个抽象级别。这是因为它进一步混淆了真正的数据处理方式,留下了另一个寻找可能想要弄清楚所有工作方式的人的位置。

最重要的是,你应该以一种跨系统(或至少是你的项目)一致的方式强制执行引用完整性。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接