データベース内にネストされたカテゴリを作成するにはどうすればよいですか?
-
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を処理するために、それをスクリプトを必要とするように、階層下に深く行くように