SQL Server数据库设计问题/挑战

时间:2009-11-03 21:16:46

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

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

节点表

NodeID
ParentNodeID
NodeTypeID
NodeName
...

NodeType表

NodeTypeID
ParentNodeTypeID
NodeTypeName
.....

两个表都与自身有关系。

有不同类型的节点,即 节点 现场 建造 办公室

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

实现这一目标的最佳方法是什么?或者我是否希望在SQL中做很多事情并且应该在代码中处理它?<​​/ p>

更新

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

3 个答案:

答案 0 :(得分:1)

我会做以下

<强> NodeTypes

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绑定,但是为Nullable(读取)

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

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

答案 1 :(得分:0)

我会保留特定于数据库中节点的NodeType,并处理业务层中节点类型的汇总。这样,如果父项上发生了某些变化,您只需更新数据库中的1条记录,而不是大数(包含所有相关的子更新以深入挖掘层次结构)。

答案 2 :(得分:0)

我会假设Node表上还有NodeTypeID吗?否则我认为你存储数据的方式很好。

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