有限树与实例的关系映射

时间:2012-08-06 15:21:39

标签: sql oracle oracle10g data-modeling hierarchical-data

我必须在关系数据库中表示以下结构。 有五个层次结构级别: A B C D 。 层次结构级别之间的关系始终是一对多, 所以 A 有很多 B ,但每个 B 都属于某个 A 。 这同样适用于 B C D E 。 到目前为止 B A 作为外键, C B 作为外键等等。

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

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

假设我有MyB个实例fo和实例ba。 现在foba必须拥有相同数量的孩子和他们的孩子 孩子们也必须拥有相同数量的孩子。 在一个实例中,孩子将在另一个实例中具有某些值 不同的值,但子树具有相同的结构。

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

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

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

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

修改

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

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

1 个答案:

答案 0 :(得分:0)

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

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

第2级会有多个节点, 在您的示例中,您将每个节点中的节点枚举为(1,2,4等)。 在真实数据库示例中,您将了解nodeId。 即:table可以像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的实例。