テーブルに必要な外部キーが多すぎる場合、どのような選択肢がありますか?


8

パーツを定義し、パーツ番号、説明、価格、重量などの情報を保持するベーステーブルがあります。ベーステーブルを参照し、タイプ/カテゴリに基づいてパーツに関する追加情報を提供する約400のテーブルもあります。

最初は外部キー制約を使用して、400のパーツ固有のテーブルのいずれかで参照されている場合、そのパーツをベーステーブルから削除できないようにしましたが、SQL Server 2005の推奨される最大253の外部キーにすぐに達しました。

この状況で、データの整合性を保証する外部キーに代わるものはありますか?データにアクセスする際のパフォーマンスの問題は確認されていませんが、クエリプランが複雑すぎるため、ベーステーブルの既存の部分の更新は失敗します。


14
400個の部品固有のテーブルが本当に必要だと思いますか?これらの各テーブルは実際にどの程度異なっていますか?このデザインの間違った部分を修正しようとしていると思います。
アーロンバートランド

2
このデータベースでは、おおよそ何行を処理していますか?
Jon Seigel 2013年

4
Aaron Bertrandに同意する必要があります。設計でsqlサーバーがサポートする外部キーを最大化する必要がある場合は、再設計を検討するときかもしれません。
DForck42 2013年

5
価格、製品管理、製品仕様など、この分野で多くの設計を行ってきました。高度に正規化されたデザインであっても、同じテーブルのFKの数に近づくことはありません。この方向で設計する原因となった、ある種のデータ分割戦略(クライアントまたは時間などによる)をおそらく実行していますか?設計と設計目標に関するいくつかの詳細な情報なしに答えを提供することは困難です。
Karen Lopez

4
あなたは...これらのテーブルの言う5のスキーマの例を提供することができます
ダミールSudarevic

回答:


6

パーツをグループ化する方法がある場合は、回避策として中間テーブルを導入できる場合があります。 これは機能しません。

Parts
+ Table 1
+ Table 2
+ ...
+ Table 400

しかし、これらの線に沿った何かがかもしれません。

Parts
+ RedOrangeYellow parts
  + Table 1
  + Table 2
  + ...
  + Table 200

+ GreenBlueIndigoViolet parts
  + Table 201
  + Table 202
  + ...
  + Table 400

ただし、これを行うことをお勧めする前に、DDLをしっかりと確認したいと思います。そして、これを行う場合は、ID番号をあちこちに投げ始めないでください。「GreenBlueIndigoVioletパーツ」を含めずに、「Table 400」を「パーツ」に直接結合できる必要があります。



-4

400以上のテーブルを1つに置き換えます。3つのフィールドのみが必要です(+1オートナンバーまたは必要に応じて任意の主キー。他のフィールドから作成する必要はありません)

アイテムID属性値

したがって、他のテーブルでは各フィールドが属性を表しますが、このテーブルでは、属性はすべて1つのフィールドにあります。あなたはこのようなものを持っているでしょう

ItemID属性値

靴下素材ウール

靴下の色赤

靴下重量20ポンド

エイリアンプラネットアルファケンタウリ

エイリアンカラーパープル

エイリアンフレンドリー

ItemIDは、おそらく数字/英数字です。次に、必要に応じて、必要に応じて列ヘッダーとしてAtrributes付きのクロス集計を作成します。これにより、「Alpha Centauriのすべてのアイテムを表示」などのクエリを実行できるようになります。これにより、エイリアンと、人類を一掃する疫病を含む隕石のフラグメントを返すことができます(これからです...)。

レコードの数によっては最適化が難しい場合がありますが、これを設計するにははるかに良い方法です。重複が少ないレシピの束(1万以上)を含むデータベースに対しても同じことを行いました。その場合はうまくいきました。本当に速度の問題はありませんでした。あなたが扱っている数によっては、あなたのほうが難しいかもしれません。


4
これはエンティティ属性値モデルと呼ばれ、通常、さまざまな理由からかなりひどい考えです。「アルファケンタウリ」シナリオの例として、おそらく2つのテーブルスキャンを見ており、インデックスは使用できません。また、データ型の利点をすべて無効にし、リレーショナル制約を不可能にし、一般に、最適化やスケーラブル化は行いません。このように100行以上を格納する必要がある場合は、格納しないでください。
JNK

2
@JNKが指摘するように、これは通常、良い解決策ではありません。さらに、テーブルが1つだけの場合はさらに悪くなります。私は最小で3つのテーブルだと思います(EntityEntity_AttributeEntity_Attribute_Value)。さまざまなデータ型と参照制約に半適切な処理を追加する場合は、さらに必要になります。
ypercubeᵀᴹ

1
OPは、システム内のエンティティが非常に複雑であるため、従来の正規化された設計ではある種の制限に近づいている可能性がありますが、非常に複雑なシステムは、はるかに弱い型サポートとアプリケーションレベルを提供するため、実際にはEAVでうまく処理されませんデータはすべてかなり一般的に保存されるため、参照整合性。EAVには便利な場所がありますが、現在述べられているように、この問題の回答としてそれを推奨する準備はできていません。
Cade Roux 2013年

ええ、毎日何か新しいことを学びます。私は独学で、それは私が抱えていたレシピの問題を解決するために思いついた、この男の問題と同じように聞こえる、何か正直なことでした。まぁ。その情報をありがとう、EAVを調べます。問題を解決するためのより明確な方法があるかもしれません。すべての値が同じデータ型だったので、私にとってはもっと簡単に機能したのではないでしょうか。私は知らないよ。
user2125055 2013年

2
@ user2125055問題ありませんし、批判を個人的に受け取らないでください。EAVを使用するという考えに反対しています。それが理にかなっているユースケースは間違いなくありますが、欠点があるため、非常に注意する必要があります。
JNK 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.