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

Sql server SQL Server数据库设计问题/挑战,sql-server,database-design,recursion,data-modeling,Sql Server,Database Design,Recursion,Data Modeling,我有一个包含node和nodetype表的数据库 节点表 NodeID ParentNodeID NodeTypeID NodeName ... NodeTypeID ParentNodeTypeID NodeTypeName ..... 节点类型表 NodeID ParentNodeID NodeTypeID NodeName ... NodeTypeID ParentNodeTypeID NodeTypeName ..... 两个表都与自身有关系 有不同类型的节点,即 节点 场地 建

我有一个包含node和nodetype表的数据库

节点表

NodeID
ParentNodeID
NodeTypeID
NodeName
...
NodeTypeID
ParentNodeTypeID
NodeTypeName
.....
节点类型表

NodeID
ParentNodeID
NodeTypeID
NodeName
...
NodeTypeID
ParentNodeTypeID
NodeTypeName
.....
两个表都与自身有关系

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

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

实现这一目标的最佳方式是什么?或者我希望在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

我将持有数据库中特定于该节点的节点类型,并在业务层处理节点类型的汇总。这样,如果父项发生更改,您只需更新数据库中的一条记录,而不必更新大量记录(使用所有相关的子更新来深入层次结构)。

我将保留数据库中特定于节点的节点类型,并在业务层中处理节点类型的汇总。这样,如果父项发生更改,则只需更新数据库中的1条记录,而不必更新大量记录(使用所有相关的子更新来深入层次结构)。

我假设节点表上也有一个NodeType ID?否则,我认为您存储数据的方式很好


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

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


您将遇到的最大挑战是,通过查询节点/节点类型的属性、其父属性、,等等。使用SQL完成所有这些工作可能是一场噩梦,最好让应用程序的数据访问层或业务层来完成,这样更容易实现。

我将执行以下操作

节点类型

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)
  • ParentNodeTypeId与自联接的NodeTypeId关联
节点

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)
  • ParentNodeId为自联接绑定到NodeId
  • NodeTypeId与NodeTypes表中的NodeTypeId绑定,但可为空(继续读取)
我将使用一个名为
GetNodeTypeForNodeId(@NodeId为整数)
的递归函数来计算节点类型。如果当前行具有非空值,则返回当前值,否则继续父节点链,直到找到具有非空值的父节点


请注意,对于大型数据集,这将非常昂贵。在我的结果集完全定义之前,我会避免使用该函数——换句话说,使用子查询或CTE来获取基本筛选,然后在函数上使用来获取节点类型。

我将执行以下操作

节点类型

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)
  • ParentNodeTypeId与自联接的NodeTypeId关联
节点

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)
  • ParentNodeId为自联接绑定到NodeId
  • NodeTypeId与NodeTypes表中的NodeTypeId绑定,但可为空(继续读取)
我将使用一个名为
GetNodeTypeForNodeId(@NodeId为整数)
的递归函数来计算节点类型。如果当前行具有非空值,则返回当前值,否则继续父节点链,直到找到具有非空值的父节点


请注意,对于大型数据集,这将非常昂贵。在我的结果集完全定义之前,我会避免使用该函数-换句话说,使用子查询或CTE来获得基本筛选,然后在函数上使用以获取节点类型。

如果您可以包含一个您希望能够生成的示例结果集,这会有所帮助。我想这会引发另一个问题,即如何通过节点向下传播数据。编辑的问题如果您可以包含一个您希望能够生成的示例结果集,这会有所帮助。我想这会引发另一个问题,即如何通过节点向下传播数据。编辑的问题抱歉是,节点表有NodeTypeId抱歉是,节点表有NodeTypeId层次结构的操作和定义是业务规则,因此属于业务规则层,而不是DAL,如果您要使用代码。层次结构的操作和定义是一个业务规则,因此,如果您要使用代码,则属于业务规则层,而不是DAL。我假设NodeTypeId as VarChar(100)是一个拼写错误?我假设NodeTypeId as VarChar(100)是一个拼写错误?