2009-05-29 16 views
7

カテゴリを入れ子にするビデオのウェブサイトを作成しています:データベースにネストされたカテゴリを作成するにはどうすればよいですか?

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

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

誰かがこのようなデータベースを作成する方法を教えてください。

+0

が重複していますか? http://stackoverflow.com/questions/317322/optimized-sql-for-tree-structures –

+0

https://stackoverflow.com/questions/17081951/my-sql-multiple-category-subcategory-subcategory – Calvin

答えて

7

Quassnoiは言った:

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

私は両方の実装に使用しました。

カテゴリテーブルが頻繁に変更されない場合は、select句では高速で、1つのリクエストでは特定のエントリの階層の全体的な分岐を取得できるため、ネストされたセットアーキテクチャを使用します。しかし、挿入または更新句では、左右の(または下の例では下の)フィールドを更新するのに親子モデルより時間がかかります。

他のポイントは、私は認めなければなりませんが、
データベース内で直接階層構造を変更することは非常に難しいことです(開発中に発生する可能性があります)。

:だから、最初

はここで対象に2件の記事です(ノードまたは全部枝などを削除、ブランチノードを移動し、親ノードの変更)ネストされたセットでプレイするためのインタフェースを実装するようにしてください

最後の事は、私はそれを試していないが、私はあなたが肝炎できることをどこかで読んネストされたセットテーブル内の複数のツリー、私はいくつかのルーツを意味します。

3

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 

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

詳細はthis answerを参照してください。

Nested setsはクエリが簡単ですが、更新するのは難しく、ツリー構造を構築するのは難しいです。

11

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

  • 区分 - 整数
  • 区分名 - 文字列/ 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 
+0

どうすればそのようなテーブルからナビゲーションを作成するクエリですか?簡単な方法はありますか? – MathOldTimer

+0

Jake:あなたは自分のナビゲーションをどうやって行うのか分かりませんが、標準的な方法は、最初に "select * from tblCategories where ParentID is NULL"というようなクエリを使用して最上位レベルなどを表示することですあなたは犬と猫を得るでしょう。それからあなたが犬をクリックすると、1がdogのcategoryidなので、 "Select * from tblCategories where ParentID = 1"という質問をして次のレベルを得ることができます。そしてあなたはあなたが掘り下げていくのと同じ方法で続けます。 – TheTXI

+0

ありがとう!これは役に立ちました! – MathOldTimer

0

何が必要なの基本的な親子関係である:

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

それはあなたがそれを可能にしたいと思いますのように見えるあなたの質問に例から(例えば、 "MITビデオ - >ビデオ1プログラミング"と同様に "ビデオ - >ビデオ1プログラミング")、ParentIDカラムを追加するだけでは不十分である。

CategoryID列とCategoryName列を持つ単純なCategoriesテーブルと、ParentCategoryID列とChildCategoryID列を持つ個別のCategoryRelationshipsテーブルという2つのテーブルを作成することをお勧めします。このようにして、特定のカテゴリに必要な数の親子関係を指定できます。このモデルを使って、2つのカテゴリがお互いに親子である二重の関係を持つことさえ可能です。(。私の頭の上から、私はこのシナリオのための偉大な使用を考えることはできませんが、少なくともそれはモデルがどのように柔軟な説明)

+0

ありがとう!これはまさに私が望んでいたものです。一例として、「アセンブリ言語のプライマービデオ」は、「リバースエンジニアリングの基礎」と「プログラミング言語」の両方に記載する必要があります。 – MathOldTimer

0

テーブルのPARENT_IDを格納するための良い方法は、それが 111110スタンフォードビデオ

を 111100 C言語プログラミング 110000 C言語 111000ビデオ1のプログラミングID 例えば

100000内にネストさせることです

などです。最初の数字が最上位のカテゴリを表すように、IDを処理するスクリプトが必要です。階層の深いところに行くほど

+0

これは非常に興味深い方法です。このようなデータをクエリする方法はありますか? –

+0

これは、10のトップレベルアイテム0-9に制限していませんか?ゼロを使​​用する理由は何ですか?可能な子供の数を制限する整数の設定数を使用していますか?どのように新しいアイテムを挿入し、それらを更新しますか? –

関連する問題