データベース内にネストされたカテゴリを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/926175

  •  06-09-2019
  •  | 
  •  

質問

カテゴリがネストされるビデオ Web サイトを作成しています。

例えばプログラミング - > C言語 - > MITビデオ - >ビデオ1プログラミング - > C言語 - >スタンフォードビデオ - >ビデオ1プログラミング - > Python->ビデオ1

これらのカテゴリとサブカテゴリは、ユーザーによってその場で作成されます。ユーザーがコレクションを簡単に閲覧できるように、ユーザーがコレクションを作成するときに、ナビゲート可能なメニューの形式でそれらを表示する必要があります。

誰かがそのようなデータベースを作成する方法を教えてくれませんか?

役に立ちましたか?

解決

カスノイ氏はこう語った。

ネストされたセットまたは親子モデルのいずれかを使用する必要があります。

以前は両方とも実装していました。私が言えることは次のとおりです。

カテゴリ テーブルが頻繁に変更されない場合は、ネストされたセット アーキテクチャを使用します。これは、select 句では高速であり、1 回のリクエストだけで特定のエントリの階層のブランチ全体を取得できるためです。ただし、insert 句や update 句では、左右 (以下の例では下部と上部) のフィールドを更新するのに、親子モデルよりも時間がかかります。

もう 1 つの点は、非常に些細なことだと認めざるを得ませんが、次のとおりです。
データベース内で直接手動で階層を変更するのは非常に困難です (開発中に発生する可能性があります)。したがって、ネストされたセットを操作するためのインターフェイスを必ず最初に実装してください (親ノードの変更、ブランチ ノードの移動、ノードまたはブランチ全体の削除など)。

このテーマに関する 2 つの記事を次に示します。

最後に、私は試しませんでしたが、ネストされたセット テーブルに複数のツリー、つまり複数のルートを含めることができるとどこかで読みました。

他のヒント

次のフィールドを含むカテゴリ テーブルを作成します。

  • カテゴリID - 整数
  • カテゴリ名 - 文字列/Varchar/何でも
  • ParentID - 整数

ParentID は、その親の CategoryID を参照します。

例:

CategoryID CategoryName ParentID
---------------------------------
1          Dog          NULL
2          Cat          NULL
3          Poodle       1
4          Dachsund     1
5          Persian      2
6          Toy Poodle   3

それはあなたが特定のカテゴリが複数の親(例えば、「MITのビデオ - >ビデオ1プログラミング」持ってすることが可能になりたいと思いますのように見えるあなたの質問に例からだけでなく、を「ビデオ - >ビデオ1つのプログラミング「)、これは単にのParentID列を追加する場合には十分ではない。

区分と区分名列を持つシンプルなCategoriesテーブル、およびParentCategoryIDとChildCategoryID列を持つ別のCategoryRelationshipsテーブル:

私は2つのテーブルを作成することをお勧めします。あなたが任意の特定のカテゴリのためにしたいので、この方法は、あなたは、できるだけ多くの親子関係を指定することができます。それも、二つのカテゴリーが同時にお互いの親と子のある二重の関係を持つように、このモデルを使用して可能です。 (私の頭の上から、私はこのシナリオのための偉大な使用を考えることはできませんが、少なくともそれはモデルがどのように柔軟示しています。)

あなたはnested setsまたはparent-childモデルのいずれかを使用する必要があります。

Parent-childます:

typeid parent name

1      0      Buyers
2      0      Sellers
3      0      Referee
4      1      Electrical
5      1      Mechanic
SELECT  *
FROM    mytable
WHERE   group IN
        (
        SELECT  typeid
        FROM    group_types
        START WITH
                typeid = 1
        CONNECT BY
                parent = PRIOR typeid
        )

Oracle内のすべてのバイヤーを選択します。

Nested setsます:

typeid lower  upper  Name
1      1      2      Buyers
2      3      3      Sellers
3      4      4      Referee
4      1      1      Electrical
5      2      2      Mechanic
SELECT  *
FROM    group_types
JOIN    mytable
ON      group BETWEEN lower AND upper
WHERE   typeid = 1

任意のデータベース内のすべてのバイヤーを選択します。

詳細については、この答えはを参照してください。

Nested sets照会する方が簡単ですが、それはツリー構造を構築するために更新することが難しくだ。

あなたが必要なものの基本的な親子関係です。

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))

テーブルのPARENT_IDを格納するための良い方法は、それはID内にネストさせることです 例えば

100000プログラミング 110000 C言語 111000ビデオ1つのプログラミング 111100 C言語 111110スタンフォードビデオ

すべてのetc..soあなたは最初の数字がトップレベルのカテゴリを表し、というようにIDを処理するために、それをスクリプトを必要とするように、階層下に深く行くように

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top