3

私は、ユーザーが販売しているさまざまなタイプのアイテムの詳細なフィールドを持つ分類広告を投稿できるウェブサイトをプログラミングしています。しかし、私は最高のデータベーススキーマについて質問があります。単一継承または多態性?

サイトには多くのカテゴリ(車、コンピュータ、カメラなど)があり、広告の各カテゴリにはそれぞれ異なるフィールドがあります。たとえば、車にはドア、メイク、モデル、馬力などの属性がありますが、コンピュータにはCPU、RAM、マザーボードモデルなどの属性があります。

これらはすべてリストであるため、多形それぞれのカテゴリー(COMPUTERS、CARS、CAMERAS)ごとに親LISTINGSテーブルと異なる子テーブルを作成します。各子表には、リスト表にリンクするリストIDがあります。したがって、リスティングがフェッチされると、関連する子テーブルのリンクされた行で結合されたLISTINGSから行がフェッチされます。

LISTINGS 
-listing_id 
-user_id 
-email_address 
-date_created 
-description 

CARS 
-car_id 
-listing_id 
-make 
-model 
-num_doors 
-horsepower 

COMPUTERS 
-computer_id 
-listing_id 
-cpu 
-ram 
-motherboard_model 

ここで、このスキーマは良い設計パターンですか、これを行うには良い方法がありますか?

私は単一の継承を考慮しましたが、テーブルがあまりにも大きくなりすぎるため、考えをすぐに払拭しましたが、別のジレンマが思い浮かびました。ユーザーがすべてのリスティングについてグローバル検索を行うと、それぞれの子テーブルを個別に照会します。 100以上のカテゴリがある場合はどうなりますか?効率的ではないでしょうか?

また、各カテゴリのフィールドを定義するマスターテーブル(メタテーブル)と各リストのフィールド値を格納するフィールドテーブルがありますが、データベースの正規化には反対のアプローチが考えられますか?

Kijijiのようなサイトではどうしますか?

答えて

2

データベースの設計は問題ありません。あなたが持っているものを変更する理由はありません。私は検索がいくつかのやり方をしているのを見ました。 1つは、検索するストアドプロシージャを使用して、検索するすべてのテーブルを結合し、検索対象の列にインデックスを付けることです。私がそれを行ったのは、検索が必要なフィールドのコピーを取得する検索にのみ使用されるテーブルを持つことでした。次に、これらのフィールドにトリガーを置き、検索テーブルを更新します。

両方とも欠点がありますが、最初から2番目の方が好ましいです。

編集

次の表が必要です。

カテゴリー - イド - あなたが検索時に指定したカテゴリのすべてのあなたのリストに参加することができ、このクロスリファレンスモデルとListingId

- 説明

CategoriesListingsXref - 区分 。その後、少し動いているSQLを追加して(理解しやすいので)、検索したいフィールドをインクルードしてクエリをビルドし、クエリに対してexecuteを実行します。

これだけです。

EDIT 2 これは、これらのコメントボックスに収まるように少し大きめの議論のようです。しかし、私たちが議論するものは、次の記事を読むことで理解することができます。 http://www.sommarskog.se/dyn-search-2008.html

これは本当に完全であり、プロと短所でそれを行う方法は1つ以上あります。 幸運。

+0

異なる属性を持つCARSテーブルとCOMPUTERSテーブルを一緒に結合する方法はありますか。 – peter

+0

カテゴリテーブルが必要です。あなたは、リストへのカテゴリのための相互参照テーブルを持つ必要があります。次に、ユーザは検索中にカテゴリを選択する。 category_idをsearch_stored_procに渡し、category_idを使用してcategories-xrefテーブルを使用して検索したいフィールドと結合します。私がここで取り上げることができないいくつかの詳細があります。たぶん私は元の答えを編集する必要があります。しかし、これはあなたが従うコンセプトです。 – phillip

+0

または、動的SQLを使用して検索クエリを構築して呼び出すことができます。それも優れたアプローチです。ガイドの方法については、この記事を参照してください。 http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1 – phillip

0

あなたが選んだデザインは、今説明したシナリオに適していると思います。サブクラスの表に独自のIDが必要かどうかはわかりませんが。 CARはリストなので、値は同じ「ドメイン」からのものであることが理にかなっています。

典型的な分類された広告サイトでは、広告のデータは1回書き込まれ、その後は基本的に読み取り専用です。これを利用して、ユーザーに検索させたいだけの方法で検索するように最適化された第2のテーブルのセットにデータを格納することができます。また、検索問題は実際には「一般的な」検索にのみ存在します。ユーザーが特定のタイプの広告を選択すると、より高度な検索を行うためにサブクラステーブルに切り替えることができます(RAM> 4GB、CPU =圧倒)。

関連する問題