代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  1
  • David  · 技术社区  · 16 年前

    我有一个具有node&nodeType表的数据库。

    节点表

    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
    
    3 回复  |  直到 16 年前
        1
  •  1
  •   Raj More    16 年前

    我会做以下的

    节点类型

    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关联,但可以为空(在上读取)

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

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

        2
  •  0
  •   Eric Petroelje    16 年前

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

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

        3
  •  0
  •   Agent_9191    16 年前

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