2

リレーショナル データベースで次の構造を表す必要があります。ABCDの5 つの階層レベルがあります。階層レベル間の関係は常に 1 対多であるため、Aには多数のBがありますが、すべてのBは 1 つの特定の Aに属しています。同じことがBCDEにも当てはまります。これまでのところ、 BAを外部キーとして持ち、CBを外部キーとして持ちます。

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

複雑なのは、Bから下に向かってインスタンスを表現しなければならないことです。1 つの特定のBに対して、多くの異なるインスタンスを持つことができます。すべてのインスタンスのデータは異なりますが、以下のツリー構造は同じです。

MyBinstancefoと instanceがあるとしましょうbafobaは同じ数の子供を持つ必要があり、その子供たちも同じ数の子供を持つ必要があります。あるインスタンスでは、子は別のインスタンスで特定の値を持ちますが、サブツリーの構造は同じです。

多くのBが存在する可能性があるため、多くのサブツリー構造が存在する可能性がありますが、ツリーの深さは常に 4 に制限されます。

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

2fo子が 1 人で孫が 2 人いる場合は、子が 1 人で孫が 22ba人いる必要があります。

この構造をリレーショナル データベースにきれいにマッピングするにはどうすればよいですか?

編集

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 に答える