我有一个有节点和数据库的数据库。节点类型表。
节点表
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
答案 0 :(得分:1)
我会做以下
<强> NodeTypes 强>
NodeTypeId as INT
ParentNodeTypeId as INT
NodeDescription as VarChar (100)
<强>节点强>
NodeId as INT
ParentNodeId as INT
NodeTypeId as INT /* This field must be NULLABLE */
NodeDetails as VarChar (100)
我会有一个名为GetNodeTypeForNodeId (@NodeId as Integer)
的递归函数来计算节点类型。如果当前行具有非null,则返回当前值,否则返回父节点链,直到找到具有非null值的父级。
请注意,对于大型数据集,这会非常昂贵。我会避免使用该函数,直到我的结果集被完全定义 - 换句话说,使用子查询或CTE来获得基本过滤,然后使用函数来获取NodeType。
答案 1 :(得分:0)
我会保留特定于数据库中节点的NodeType,并处理业务层中节点类型的汇总。这样,如果父项上发生了某些变化,您只需更新数据库中的1条记录,而不是大数(包含所有相关的子更新以深入挖掘层次结构)。
答案 2 :(得分:0)
我会假设Node表上还有NodeTypeID吗?否则我认为你存储数据的方式很好。
您将遇到的最大挑战是通过查询其属性,父属性等来确定节点/节点类型的“有效”属性。使用SQL做所有这些可能是一场噩梦,最好留给应用程序的数据访问或业务层,以便更容易实现。