3

私のプログラムには、すべて特定のカテゴリに属する​​アイテムがたくさんあります。そのカテゴリーに属する商品だけを返品したいです。問題は、カテゴリが親カテゴリを持つことができることです。たとえば、子カテゴリ「果物」を持つ子カテゴリ「食品」を持つカテゴリ「スタッフ」があるとします。リンゴ、ナシ、チョコレート、コンピューターのアイテムがあります。

すべての果物を表示したい場合は、"WHERE item.category = FRUIT_ID" 句を使用してデータベース クエリを実行するのは簡単です。ただし、すべての食品を含めたい場合は、そこに果物を入れる方法も必要です。

Oracle などの一部のデータベースには再帰クエリの概念があり、それが適切なソリューションである可能性があることは知っていますが、階層データの経験があまりなく、一般的な提案を探しています。データベース スキーマを無制限に制御できると仮定すると、カテゴリ ツリーは最大 5 カテゴリの深さしかなく、可能な限り途方もなく高速である必要があります。

4

5 に答える 5

2

隣接リスト モデルを見てください。これは完全ではありません (更新が非常に遅い) が、状況によっては (階層クエリ)、特にあなたのような問題の場合に優れた表現となります。

于 2010-01-11T21:58:07.440 に答える
1

SQL でツリーを表現するための設計戦略が満載のがあります。巧妙な点だけでも一見の価値があります。

于 2010-01-11T21:56:45.197 に答える
1

カテゴリ ツリーがキャッシュできるほど小さいと仮定すると、カテゴリ ツリーをメモリに保持し、そのツリーに対して、特定のカテゴリの下にあるカテゴリ ID のリストを生成する関数を用意することをお勧めします。

次に、データベースにクエリを実行するときにIN、子 ID のリストを含む句を使用するだけです

于 2010-01-11T22:01:11.990 に答える
0

考えられる解決策の 1 つは、階層を実際の分類から分離することです。たとえば、リンゴは果物と食品の両方に分類できます。この分類では、果物が食品であるという知識はありませんが、別の場所でそれを定義できます。次に、クエリは次のように単純になりますwhere category='food'

または、クエリを作成する前に階層を調べることができ、次のようなものが必要になりますwhere category='food' or category='fruit'

于 2010-01-11T21:57:57.440 に答える
0

あなたのデータベース スキーマは非常に優れていると思いますが、この検索の実装は実際には特定の RDBMS に依存します。それらの多くには、この種の再帰を実行する方法があります。私が考えることができる 1 つの例は、これらの厄介なカーソルの非常に高速な代替手段であるCommon Table Expressionsの SQL Server のサポートです。

使用している RDBMS を指定すると、より具体的な回答が得られる場合があります。

于 2010-01-11T22:01:57.617 に答える