製品タイプごとに個別のテーブルを作成するかどうか


25

私はデータベースを設計している最中であり、最初の設計決定について再考しています...

製品タイプは次のとおりです...モデル、部品、交換部品キットおよびオプション。

オプションA(最初の設計):上記の製品タイプ用に別々のテーブルを用意する予定でした。各テーブルでフィールドの約75%が同じになると思います。

それらの間に作成する必要がある関連付けのため、各製品タイプを個別のテーブルとして作成しました。たとえば、モデルには多くのオプションがあり、オプションには多くのモデルがあります。オプションには多くのパーツを含めることができ、パーツには多くのオプションを含めることができます...など...

オプションB:個別のテーブルを作成する代わりに、モデル、パーツ、交換パーツキットおよびオプションを含むProductというテーブルを作成できます。モデルやオプションなどを区別するために、typeというフィールドを1つ持つことができます。特定の製品タイプでは、いくつかのフィールドが使用されない(nullのままになる)ことになると思います。私はこれが「ベストプラクティスではない」が出てくる場所だと推測しています。

オプションBは、db設計の複雑さを大幅に軽減します。また、クエリのためにデータを引き出すときに、大量のテーブルを参照することを心配する必要もありません...


2
このポイントでは、テーブルレイアウトを模倣してデータを入力するスプレッドシートを作成することをお勧めします。これにより、存在する可能性のある弱点が明らかになります。
マイケルライリー-別名ガニー

外部キーが異なるテーブルにある場合、どのようにして異なるキーをポイントしますか?テーブルの継承を参照してください。
ニールマクギガン

回答:


8

これが私の設計上の決定である場合、おそらく「オプションC」(変更されたオプションa)を使用します。

まず、なぜ「オプションB」ではないのか:

一つには、各製品に独自のテーブルが用意されているという明確さが気に入っています。タイプを決定するフィールドを持つすべてが1つの大きなテーブルである場合、関係は明確ではありません。

別の方法として、インデックス戦略では常にそのタイプフィールドをリストする必要があります。4種類しかないため、インデックスのカーディナリティは非常に低くなります(SELECT * FROM product_table WHERE type='X'基本的にはとにかく全表スキャンを実行しています)

オプションC

  • すべてのタイプが共有する列のみを保持する親テーブルを作成します
  • 各製品タイプをそれぞれの列を持つ独自のテーブルとして作成し、さらに1つ追加します:親テーブルへのリンク
  • Product_Option、Model_optionなど、それぞれのキーへのリンクを含む各「リンク」テーブルを作成します。
  • 相互リンク(MODEL_OPTION、OPTION_MODEL)を使用する場合は、これらのテーブルも作成してください。これにより、それを見ている人にとって結合が明確になります。

欠点は、物事が更新/削除されたときに孤児を確実に回避し、これらのテーブルを使用するクエリを最初に設計する複雑さです。


5
現在は4つのタイプしかありませんが、後でさらに追加された場合はどうなりますか?Amazonのメインの製品テーブルはもともと「Books」と呼ばれていましたが、現在、製品タイプごとに個別のテーブルがあると思いますか?各タイプに独自のテーブルが必要だとは思いませんが、EAVモデルを使用して、各タイプに共通する追加のプロパティを作成できます。
アーロンバートランド

1
@Aaron Fairは、将来の製品タイプの増加について指摘しています。このシナリオが10種類以上の製品に拡張できると考えられる場合は、考え直します。しかし、特定の製品表は、少量の製品タイプに対しては公正な設計選択だと感じています。
デレクダウニー

1
オプションC:リンクテーブルが必要ですか?Product_Option PKがProductテーブルのPKと一致し、それが両方のテーブルをリンクする関連付けを作成すると想像します。
11

Product_optionを例として使用すると、スキーマは(私の考えでは)id、productID、optionIDになります。productIDはFKにproduct.idなりoptionID、FKになりoption.idます。それがリンクテーブルの意味です。はい、この設計では、単一の製品が複数のオプションにリンクできるようにする必要があります。
デレクダウニー

わかった。入力内容を読み違えました。
11

7

「正しい」リレーショナルモデルであるオプションAから開始することをお勧めします。そのモデルの一般的な使用法によって、一部の領域で非正規化に向かう​​場合は、恐れずに非正規化してください。

先週、同僚と、スキーマの設計が石のように設定され、決して変更できないものであると見なされることが多い方法について議論していました。奇妙なことに、アプリケーションの他のすべてのレイヤーでリファクタリングがどのように受け入れられているかを考えると、データベーススキーマのリファクタリングは依然として実用的ではないと見なされています。

データベースへのインターフェースが適切に設計されていれば、システムの使用パターンについてさらに学習しても、スキーマの適応を妨げるものは何もありません。


2

非常によく似たこの音素材/複数カーディナリティの手形のポール・ニールセンが中に記述することをheirarcy 第17章SQL Server 2008のバイブル

この章全体は非常に読みやすく、多対多の問題に対処する特定のセクションは416〜419ページにあります。

これは、データ設計の爆発部品タイプに関して私が見た最も良い議論です。


このソリューションは、オプションBに似ています(正しく理解できれば、わかりません)。モデル、オプション、キットなどの間の関連付けを作成するためのマスターテーブル(製品)と「リンク」テーブル(別名隣接テーブル/ BillsofMaterials)があります。それは正しいですか?
-18:06で

この問題はオプションのために曇っていると思います。議論のオプションを少しだけ取り上げましょう。部品は最小単位です。部品のグループがモデルを構成します。キットの形の交換部品のグループは、モデルのサブセットを構成します。ここまでは順調ですね。パーツにはオプションがあり、簡単にするために、これには色(黒、赤、クロム)と材料(金属、木材、プラスチック)の2つのカテゴリが含まれると仮定します。また、モデルにはオプションがあることにも触れました。モデルのオプションはパーツのオプションとは別ですか、それともパーツによってモデルが異なるため、モデルにオプションがあるように見えますか?
マイケルライリー-別名ガニー

私の設計では、部品には「オプション」がありません。オプションを、拡張機能を提供するモデルに適用されるものとして定義します。オプションはパーツで構成されています。モデルにはさまざまなオプションがあります。オプションは多くの異なるモデルにも適合します。
11

それはあなたの質問の言い方ではありません。引用:「たとえば、モデルには多くのオプションがあり、オプションには多くのモデルがあります。オプションには多くのパーツがあり、パーツには多くのオプションがあります...など...」テーブルレイアウトを模倣したスプレッドシートを作成し、データを入力します。これにより、存在する可能性のある弱点が明らかになります。
マイケルライリー-別名ガニー

0

4つの製品タイプすべてにまたがる頻繁なクエリが発生する可能性のあるシナリオをイメージングできる場合(そして、私にはそう思われます)、オプションBが最適です。

Productテーブルに多くの未使用のNULL入力可能フィールドを残すのではなく、ModelProductテーブル、PartProductテーブル、ReplacementPartKitProductテーブルを追加し、それらのテーブルでそれらのタイプに固有のフィールドだけを追加してみませんか?これらのテーブルでは、Productテーブルと同じプライマリキーを使用します。モデルを使用する場合は、ProductテーブルとModelProductテーブルに参加します。所有している製品レコードが部品であるかどうかを判断する必要がありますか?ProductからPartProductへの左結合を行うだけで、PartProduct。[PrimaryKey]がnullでない場合、Partがあります。nullの場合、Partではありません。または、ProductTypeフィールドをProductテーブルに追加できます。


フィールドの約75%がすべてのテーブルで使用されるため、nullフィールドは最小限になります。製品タイプ間の関係についてもっと心配していると思います。同じテーブルを指すリンクテーブルが3つほどあります。Model_has_Option 2つの主キー、両方とも製品テーブルの製品ID、1つのテーブルのみを使用して製品タイプを表す場合。それが正しいことなのかどうか、私はもっと心配です。
-18:

「正しい」決定に影響する多くの要因がありますが、考慮すべき2つの広範な要因があります。1:全体的なパフォーマンス要件。2:適応性/複雑性/維持性。これら2つのうちの1つは、おそらく他の2つよりも少し重要です。速度が必要な場合は、オプションAに固執して非正規化します。重複が生じます。それは予想通りです。スキーマを定期的にいじる必要があり、速度が最も重要な要素ではない場合、オプションB。「他の人のベストプラクティス」を順守するのではなく、優先順位を知ることで「正しい」ことを実現します。
アランマクビー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.