2009-11-03 108 views
1

我有一个数据库,它有节点& nodetype表。SQL Server数据库设计问题/挑战

节点表

NodeID 
ParentNodeID 
NodeTypeID 
NodeName 
... 

的NodeType表

NodeTypeID 
ParentNodeTypeID 
NodeTypeName 
..... 

两个表都有其自身的关系。这适用于IE类型网站的节点

有不同类型的节点即 节点 网站 大厦 办公室

这些是分层次的,所以信息(属性),应降低传播到,并重写由其子女。

达到此目的的最佳方法是什么?或者我期望在SQL中做很多事情,并且这应该在代码中处理?

UPDATE

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

如果您可以包含您希望能够生成的示例结果集,这将有所帮助。 – 2009-11-03 21:20:31

+0

我想提出如何通过节点向下传播数据的另一个问题。编辑问题 – Dve 2009-11-03 22:05:51

回答

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联系的节点Id为自从NodeTypes表连接
  • NodeTypeId联系,NodeTypeId,但可以为空(阅读)

我会叫GetNodeTypeForNodeId (@NodeId as Integer)找出一个递归函数节点类型。如果当前行具有非空值,则返回当前值,否则请沿父节点链向上,直到找到具有非空值的父代为止。

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

+0

我假设NodeTypeId为VarChar(100)是一个错字? – Dve 2009-11-04 08:33:37

+0

@Dave:是的,这是一个错字。我只是纠正它。 – 2009-11-04 14:45:26

0

我会认为是特定于数据库的节点的NodeTypes,并处理在业务层nodetypes的卷起。这样,如果父项目上的某些内容发生更改,则只需更新数据库中的一条记录,而不是大数目(所有关联的子更新都会深入查看层次结构)。

+0

层次结构的操作和定义是业务规则,因此属于业务规则层,而不是DAL,如果您打算使用代码。 – 2009-11-03 21:46:59

+0

非常好的一点。将编辑我的回复。 – 2009-11-03 22:05:57

0

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

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

+0

对不起,节点表有NodetypeID – Dve 2009-11-03 21:28:36