我必须在关系数据库中表示以下结构。 有五个层次结构级别: 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
。
现在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 question。 如果有人将节点添加到C2然后再添加到C3,结果必须如下所示:
A 1--------
/ | |
B 1 2fo 2ba
/ | | |
C 1 2 3---- 4----
/| | |\ | |\ |
D 1 2 3 4 5 9 6 7 10
答案 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的实例。