11

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

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

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

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

4

6 に答える 6

16

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

  • カテゴリ 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
于 2009-05-29T14:15:22.090 に答える
13

カスノイは次のように述べています。

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

私はそれらの両方を実装していました。私が言えることは:

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

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

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

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

于 2009-05-29T14:48:10.823 に答える
5

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

Parent-child:

typeid 親名

1 0 バイヤー
2 0 売り手
3 0 審判
4 1 電気
5 1 メカニック
SELECT  *
FROM    mytable
WHERE   group IN
        (
        SELECT  typeid
        FROM    group_types
        START WITH
                typeid = 1
        CONNECT BY
                parent = PRIOR typeid
        )

は のすべての購入者を選択しますOracle

Nested sets:

typeid 下位 上位 名前
1 1 2 バイヤー
2 3 3 売り手
3 4 4 レフェリー
4 1 1 電気
5 2 2 メカニック
SELECT  *
FROM    group_types
JOIN    mytable
ON      group BETWEEN lower AND upper
WHERE   typeid = 1

任意のデータベース内のすべての購入者を選択します。

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

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

于 2009-05-29T14:14:14.463 に答える
5

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

2 つのテーブルを作成することをお勧めします。CategoryID 列と CategoryName 列を含む単純な Categories テーブルと、ParentCategoryID 列と ChildCategoryID 列を含む別の CategoryRelationships テーブルです。このようにして、特定のカテゴリに対して必要な数の親子関係を指定できます。このモデルを使用して、2 つのカテゴリが同時に互いの親と子になる二重関係を持つことも可能です。(私の頭の中では、このシナリオの優れた用途は思い浮かびませんが、少なくともモデルがいかに柔軟であるかを示しています。)

于 2009-05-29T14:44:54.933 に答える
0

必要なのは、基本的な親子関係です。

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
于 2009-05-29T14:15:36.070 に答える