【问题标题】:SQL Server Database Design Problem/ChallengeSQL Server 数据库设计问题/挑战
【发布时间】:2010-12-12 19:32:31
【问题描述】:

我有一个包含节点和节点类型表的数据库。

节点表

NodeID
ParentNodeID
NodeTypeID
NodeName
...

节点类型表

NodeTypeID
ParentNodeTypeID
NodeTypeName
.....

两个表都与自身有关系。

有不同类型的节点,即 节点 地点 建筑 办公室

这些是分层的,因此应用于站点类型节点的信息(属性)应该向下传播到其子节点,并且可以被其子节点覆盖。

实现这一目标的最佳方法是什么?还是我希望在 SQL 中做很多事情,应该在代码中处理?

更新

NodeID    ParentNodeID   NodeName   Address1    Address2   Address3  NodeType  NodeTypeID
1         null           Top        null        null       MyTown    Site      7
2         1              Level1     null        HeadOffice MyTown    Building  8
3         2              Level2     SalesFloor  HeadOffice MyTown    Floor     9

【问题讨论】:

  • 如果您可以包含您希望能够生成的示例结果集,这将有所帮助。
  • 我想这引发了另一个问题,即如何通过节点向下传播数据。编辑问题

标签: sql-server database-design recursion data-modeling


【解决方案1】:

我将保存特定于数据库中节点的 NodeType,并处理业务层中节点类型的汇总。这样,如果父项发生更改,您只需更新数据库中的 1 条记录,而不是大量记录(以及所有关联的子更新以深入了解层次结构)。

【讨论】:

  • 层次结构的操作和定义是一个业务规则,因此如果您要求助于代码,它属于业务规则层,而不是 DAL。
【解决方案2】:

我会假设 Node 表上也有一个 NodeTypeID?否则,我认为您存储数据的方式很好。

您将遇到的最大挑战是通过查询节点/节点类型的属性、父节点属性等来确定节点/节点类型的“有效”属性是什么。使用 SQL 执行所有这些操作可能是一场噩梦,并且最好留给应用程序的数据访问或业务层,这样更容易实现。

【讨论】:

  • 对不起,节点表有NodetypeID
【解决方案3】:

我会做以下事情

节点类型

NodeTypeId as INT
ParentNodeTypeId  as INT
NodeDescription as VarChar (100)
  • ParentNodeTypeId 与 NodeTypeId 关联以进行自联接

节点

NodeId as INT
ParentNodeId as INT
NodeTypeId as INT /* This field must be NULLABLE */
NodeDetails as VarChar (100)
  • ParentNodeId 与 NodeId 关联以进行自加入
  • NodeTypeId 与 NodeTypes 表中的 NodeTypeId 相关联,但可以为 Null(继续阅读)

我将有一个名为GetNodeTypeForNodeId (@NodeId as Integer) 的递归函数来计算节点类型。如果当前行有非空值,则返回当前值,否则沿着父节点链向上直到找到具有非空值的父节点。

请注意,这在大量数据上会变得非常昂贵。在我的结果集完全定义之前,我会避免使用该函数 - 换句话说,使用子查询或 CTE 来获取基本过滤,然后在函数上使用来获取 NodeType。

【讨论】:

  • 我假设 NodeTypeId as VarChar (100) 是一个错字?
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2015-02-20
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多