私は、ユーザーが販売しているさまざまなタイプのアイテムの詳細なフィールドを持つ分類広告を投稿できるウェブサイトをプログラミングしています。しかし、私は最高のデータベーススキーマについて質問があります。単一継承または多態性?
サイトには多くのカテゴリ(車、コンピュータ、カメラなど)があり、広告の各カテゴリにはそれぞれ異なるフィールドがあります。たとえば、車にはドア、メイク、モデル、馬力などの属性がありますが、コンピュータには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のようなサイトではどうしますか?
異なる属性を持つCARSテーブルとCOMPUTERSテーブルを一緒に結合する方法はありますか。 – peter
カテゴリテーブルが必要です。あなたは、リストへのカテゴリのための相互参照テーブルを持つ必要があります。次に、ユーザは検索中にカテゴリを選択する。 category_idをsearch_stored_procに渡し、category_idを使用してcategories-xrefテーブルを使用して検索したいフィールドと結合します。私がここで取り上げることができないいくつかの詳細があります。たぶん私は元の答えを編集する必要があります。しかし、これはあなたが従うコンセプトです。 – phillip
または、動的SQLを使用して検索クエリを構築して呼び出すことができます。それも優れたアプローチです。ガイドの方法については、この記事を参照してください。 http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1 – phillip