2

我必须在关系数据库中表示以下结构。有五个层次结构级别:ABCD。层级之间的关系总是一对多的,所以A有很多B,但是每个B都属于某个A。这同样适用于BCDE。到目前为止, BA作为外键,CB作为外键,依此类推。

A          1
         / |
B       1  2
      / |  |
C    1  2  3 
    /|  |  |
D  1 2  3  4

事情变得复杂的地方是我必须从B向下表示实例。对于某个B,我可以有许多不同的实例。所有实例都有不同的数据,但下面的树结构相同。

假设我有MyBinstancefo和 instance ba。现在fo并且ba必须有相同数量的孩子,他们的孩子也必须有相同数量的孩子。在一种情况下,子树将具有某些值,而在另一种情况下,子树将具有不同的值,但子树具有相同的结构。

因为可以有很多B,所以可以有很多子树结构,但是树的深度总是限制为四个。

A          1
         / |  \
B       1  2fo 2ba 
      / |   |   |
C    1  2   3   4 
    /|  |   |\  |\
D  1 2  3   4 5 6 7

如果2fo有一个孩子和两个孙子2ba也必须有一个孩子和两个孙子。

如何在关系数据库中干净地映射此结构?

编辑

比评论中更详细地回答X-Zeros 问题。如果有人将一个节点添加到 C2,然后再添加到 C3,则结果必须如下所示:

A          1--------
         / |       |
B       1  2fo    2ba 
      / |   |      |
C    1  2   3----  4----
    /|  |   |\  |  |\  |
D  1 2  3   4 5 9  6 7 10
4

1 回答 1

0

层次结构将通过 parentId 在表中表示。ParentId 是自引用外键。

您可以编写递归查询来选择级别 B。

级别 2 将有多个节点,在您的示例中,您将每个节点中的节点枚举为 (1,2,4,etc )。在真实的数据库示例中,您将知道 nodeId。即:表可以像 table_ABCDE ( nodeId, letterRep, parentId )

如何表示 B 级下的实例:创建另一个表以保持实例的根从概念。创建表实例( id , instance_from_node , name )即: (444, B2, 2fo ) instance_from_node 是 table_ABCDE nodeId 的外键

算法如何添加一个新实例: 0- 在主树(table_ABCDE)中标记 B2 作为模板。

1-检查给定节点的表实例表,即:2fo;如果 2fo 不在实例表中,首先添加 2fo (444, B2, 2fo ),然后添加 2ba (445, B2, 2Ba )

2- 将所有新节点插入 table_ABCDE。所有新节点均指节点 2fo 和下面的所有节点。

如果有任何添加/删除,请找到 B 级父级,并将相同的更改应用于该级别的所有实例。要查找 B 级父级,还可以使用实例表来查看 2fo 和 2ba 都从 B2 驱动。

如果你从 2fo 创建一个实例,你需要检查实例表,你会看到 2fo 是 B2 的实例,你实际上是从 B2 创建一个实例。您还将将该实例作为 B2 的实例输入。

于 2012-09-30T00:43:29.167 回答