【问题标题】:Keeping HierarchyID up to date使 HierarchyID 保持最新
【发布时间】:2018-03-12 19:27:49
【问题描述】:

我正在将旧的国家/地区/位置数据库结构重构为层次表。

我将使用新表的主键和自引用 ParentID 列(在主键上)作为 hierarchyid 列的基础。

因此我的桌子看起来像:

PK 名称 ParentID HierarchyID

1 个世界 NULL /

2 英国 1 /1/

3 维冈 2 /1/2

我的问题是:当创建记录或更改记录的父级时,其他人实施了哪些方法来使 hierarchyid 列保持最新?

注意;我正在使用 LINQtoSQL(我使用计算的 hierarchyid.ToString() 列来公开代码中的沿袭,加上存储过程来为我提供 hierarchyid 查询的性能优势)。

对于插入/更新管理:

我考虑过为我的新表覆盖 LINQtoSQL 中的插入/更新过程。

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

我考虑在插入/更新后使用递归触发器来执行基于 ParentID 的更新。

但是,我还没有决定要走哪条路!

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

【问题讨论】:

    标签: sql-server-2008 linq-to-sql hierarchical-data


    【解决方案1】:

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

    使用存储过程的好处在于它从应用层抽象了 id 管理,因此开发人员不需要了解底层数据库模型。同样在不好的方面,它从应用层抽象了 id 管理,因此开发人员如果不前往数据库并查看存储过程,就无法理解底层数据库模型。

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

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

    【讨论】:

    • 感谢您的建议,我会坚持使用我认为的 sproc。我有一个 RefreshLocationHierarchy sproc,它使用一个层次结构重新加载整个表的数据。这将在所有更新和插入之后调用(不会那么频繁)。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2010-09-05
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多