DB / Entity Design:複数のテーブルのいずれかに関連するテーブル
-
03-07-2019 - |
質問
レポートには複数のチャートを含めることができます。 グラフの表は次のとおりです。
- チャート- Id 、 ChartId 、 ReportId 、...
上記の ChartId は、 ChartId から次のいずれかの ChartId にマッピングできます。
- 線: ChartId 、厚さ、 YAxis 、 XAxis 、色、...
- パイ: ChartId 、半径、色、...
- バー: ChartId 、 Width 、 Color 、 Border 、.. 。
SQL Serverを使用していますが、残念ながらCouchDBなどの代替ソリューションは実行可能なオプションではありません。また、Entity Frameworkを使用してこれらのテーブルをエンティティにマップする予定です。
この設計は最初の突き刺しであり、この設計には複数の問題があります:
- グラフ。 ReportId は複数のテーブルの外部キーにはできないため、FKを強制することは問題です。
- SQL(またはLinq)クエリを実行する場合、2つのクエリを実行してチャートタイプを取得し、そのテーブルをクエリする必要があります。または、グラフデータを取得するには、すべてのテーブルに対して join を実行する必要があります。
- グラフタイプに対して結合を行う場合、これらのテーブルの ChartId は一意である必要があるため、 Chart 。 ChartId は1つのみにマッピングされます Line 。 ChartId または Bar 。 ChartId または Pie 。 ChartId 。
- EFでこれをマッピングするのは難しいでしょう。
これは十分に一般的な問題であり、処方された解決策とそれを処理する確立された方法があると思います。
デザインの正しい道を進んでいますか?その場合、上記の問題(FK、結合、複数のテーブルにわたる一意のID、マッピング)を克服する方法。
解決策
この回答は戦略について非常に包括的なものです。 SQLチームの SQL Serverでのテーブル継承の実装希望の場所に来ました。
解決
チャートを同じテーブルに配置し、 Table perを使用することを検討したか階層継承パターン?そこのリンクは、Entity Frameworkでこれを実装する方法を示しています。実行可能かどうかは、それらすべてのチャートタイプがどれだけ異なるか、およびそれぞれが必要とするフィールドの数に依存します。
タイプごとのテーブルの継承もあります。すでに説明しているものに。
他のヒント
テーブル継承スキームでこれに取り組みます:
Chart (ChartId, ChartTypeId)
PK (ChartId, ChartTypeId)
CHECK ChartTypeId IN ('Line', 'Bar', 'Pie')
LineChart (ChartId, ChartTypeId)
PK (ChartId, ChartTypeId)
FK (ChartId, ChartTypeId) -> Chart
CHECK ChartTypeId IN ('Line')
チャートを追加するには、まず「ベース」に追加します;チャート表、そして適切な「サブタイプ」へチャート表。チェック制約により、すべてが揃っています。
折れ線グラフ。円グラフ、および棒グラフは、グラフの特殊な形式です。
ルックアップ"一般化専門化リレーショナルモデリング"このパターンに関する優れた記事。
または、結合を実行する必要があります チャートデータを取得するためのすべてのテーブル。
はい、それで構いません。