2

asp.net Webフォームとlinq-to-sqlを使用して、求人広告Webサイトを構築しています。

販売するアイテムは階層的に分類する必要がありますが、個々のアイテムは複数の子カテゴリに分類される場合があります。

例として、eBayでこのバッテリーを見てください。2つのブレッドクラムがあることに注意してください。

サウンドとビジョン>多目的バッテリーと電源>充電式バッテリー
と同様に:
コンピューター/タブレットとネットワーク>ラップトップとデスクトップアクセサリー>ラップトップバッテリー

複数のカテゴリに属する​​アイテムに加えて、カテゴリに複数の親が含まれる場合もあります。たとえば、「サウンドとビジョン>バッテリー」または「電子機器>バッテリー」のカテゴリを参照すると、まったく同じサブカテゴリが表示されます。両方の場合のバッテリー(例:充電式または非充電式など)。

Webサイトからのクエリは言うまでもなく、データベーステーブルの構造化を開始する方法についても確信が持てないため、ヘルプやガイダンスは大いに活用されます。

データベースへの階層データの保存などの記事を見てきましたが、アイテムとカテゴリの多対多の性質のため、私の場合には当てはまらないと思います。

ありがとう。

4

3 に答える 3

3

最近、私は同じ問題に直面し、このような背の高いテーブルにカテゴリを保存しています

CATEGORIES
------------------
Id
Text
ParentId

これまでのところうまくいっていますが、もっと良い答えが出てきたら気になります

たとえば、多対多の関係を築けるようにしたいので、親を別のテーブルに分割することをお勧めします。

あなたはこのようにそれを行うことができます

CATEGORIES
----------------
Id
Text


CATEGORY_PARENTS
----------------
ID
ParentId
于 2012-09-19T13:15:47.377 に答える
3

通常、最も効率的な方法は、可能な限り低いレベルでデータを分類し、データの冗長性を可能な限り回避することです。つまり、関連データをグループ(またはここではテーブル)に保持し、(IDに結合テーブルを作成して)テーブル内の実際のデータを繰り返さないようにしながら、テーブルをできるだけ分割します。

データベーススキーマをどれだけ変更するか、または現在のスキーマをどのように構築するかはわかりませんが、1つの解決策は、すべての主要なカテゴリを格納するためのテーブル(テーブルAと呼びます)、第2レベルの別のテーブルを作成することです。カテゴリ(表B)と最低レベルのカテゴリ(表C)用にもう1つ。

次に、新しいテーブル(テーブルD)を作成して、テーブルAとテーブルBをアタッチできます。これで、メインカテゴリとサブカテゴリが接続されます。

現在、サブカテゴリのサブカテゴリを作成するのは少し難しいです。この問題は、現在のアイテムが「サブサブアイテム」であるかどうかを示すフィールドをテーブルDにもう1つ追加することで解決できます(私の名前の意味は:Pです)。つまり、インジケーターフィールドが0の場合はそのサブカテゴリです。それ以外の場合、インジケーターフィールドの値は親サブアイテムのIDです。それは一種の自己参加です。

複数のカテゴリに属する​​アイテムの場合、アイテムテーブルとテーブルDを接続するもう​​1つのテーブル(テーブルE)を作成します。ここで、「itemID」を「subcatID」に接続します。つまり、バッテリーitemIDが10、充電式バッテリーのsubcatIDが5、ラップトップバッテリーのsubcatIDが7の場合、テーブルEに2つの行を作成します。

itemID        subcatID
  10             5
  10             7

検索するときは、10個すべてを検索すると、すべてのカテゴリが表示されます。

繰り返しますが、これは1つの可能な解決策です。スタースキーマを使用することもできますが、データウェアハウジングに特に効果的です。カテゴリレベルの番号が固定されている場合(つまり、3つのレベルのカテゴリしかない場合など)、カスケードスタイルのテーブルを使用できます(つまり、テーブルAはメインの猫、テーブルBはサブ猫、テーブルCは最後のサブサブ猫です)。 。)。これにより、クエリは少し長くなりますが、それでも単純になります。私はデータベース分野から始めているだけなので、この質問をデータベースタグで移動/タグ付けすると、おそらくより良い答えが得られます。

幸運を!

于 2012-09-19T14:12:48.230 に答える
0

私の質問に答えてくれた@bhrugesh-patelと@andrew-waltersに感謝します。ただし、さらに調査すると、上記の階層は有向非巡回グラフ(DAG)と呼ばれるようです。つまり、ほぼツリーですが、大きな違いが1つあります。異なるパスを介して同じノードに到達できます。

Neo4jなどのグラフデータベースはDAGなどの構造を格納するために設計されていますが、リレーショナルデータベース(SQL Server)の使用に固執しているため、この記事で説明したソリューションの実装を試みます:有向非循環グラフを表すモデル( DAG)SQLデータベース

参考: SOに関する別の質問でも、このトピックについて詳しく説明しています。

于 2012-09-20T19:03:26.253 に答える