4

私は車を分類するためにこの階層を持っています:

                             Color
                           /       \
                      Light        Dark
                    /   |   \       /   |   \
                  Red Green Blue  Red Green Blue
                   |    |     |    |    |     |
                 Car1  Car2  Car3 Car4 Car5  Car6

しかし、私はこの階層を持つこともできます:

                             Color
                      /       |       \
                   Red      Green      Blue
                  /   \     /    \     /   \
               Light Dark Light Dark Light Dark
                  |    |     |    |    |     |
                Car1  Car4  Car2 Car5 Car3  Car6

これらをテーブルに作成するにはどうすればよいですか?

私のアイデアはそのようなものでした:

Id | ParentId | ParentId2 | Name
--------------------------------
1    Null         Null       Color
2      1                     Light
3      1                     Dark

しかし、さらに階層を追加したい場合は、ParentId列を多数追加するのは適切ではないようです。そして、私は複数の親にも問題があると思います。

目標は、これらの階層をツリービューコントロールに配置することであり、ユーザーはボタンをクリックするだけで、表示したい任意の階層を呼び出すことができます。

ありがとう !

4

2 に答える 2

2

異なる階層タイプと見なす必要があります...

Id | ParentId | Type | Name
--------------------------------
1    Null         1      Color
2      1          1       Light
3      1          1       Dark
4    Null         2      Color
5      4          2       Red
6      4          2       Green
7      4          2       Blue
8      5          2       Light
...

または、Cars、Colors、ColorTonesの3つのテーブルに正規化します。

したがって、生データをクエリしてから、コードでツリー構造ループを生成できます。

于 2013-01-10T08:42:26.320 に答える
2

個人的には、SQL に格納された階層に関しては、ネストされたセットを好みます。制約に応じてテクニックには多くのバリエーションがあり、CRUD sql ルーチンに関する多くのリソースがネット上にあります。

大きなツリーがある場合、上位の親の作成/更新/削除でパフォーマンスがわずかに低下しますが、読み取り時には優れたパフォーマンスが得られると言わざるを得ません。これは、逆の場合の再帰モデルよりも好ましいと思います.

編集:

複数の親の問題が表示されます。2 番目と 3 番目のレベルを統合してアプローチを変更することをお勧めします。あなたは次のようなものを持っているでしょう

**Node**      |       **Left**      |     **Right**      |     **Level**
Color                 1                   26                   1
LightRed              2                   5                    2
LightGreen            6                   9                    2
LightBlue             10                  13                   2
DarkRed               14                  17                   2
DarkGreen             18                  21                   2
DarkBlue              22                  25                   2
Car1                  3                   4                    3
Car2                  7                   8                    3
Car3                  11                  12                   3
Car4                  15                  16                   3
Car5                  19                  20                   3
Car6                  23                  24                   3

色を持つすべての車を取得するクエリは次のようになります

select * 
from hierarchy
where left > 1 and right < 26 and level = 3

編集2:

a-horse-with-no-nameは、DBMS が再帰モデルをサポートしている可能性があることを正しく指摘しました。もしそうなら、それはあなたにとってより良い解決策かもしれません。Sql Server のドキュメントを次に示します。

于 2013-01-10T08:44:19.913 に答える