1

テーブル「作物」、「トウモロコシ」、「大豆」、および「穀物」があります。Crop の 1 つのエントリは、他のテーブルの 1 つのエントリに対応します。ここでの問題は、Crop が他のテーブルの 1 つだけと 1 対 1 である必要があり、複数であってはならないことです。Crop テーブルが必要なのは、他のテーブルからの多くの共通データを結合し、コード側での情報のクエリをはるかに簡単にするためです。これに取り組むことから、欠点のあるいくつかの戦略があります...

A. 他のテーブルの ID 用に Crop に 3 つの列を配置し、トウモロコシの作物などの場合は「トウモロコシ」列にデータを入力します...

欠点: 無駄な列、作物を確認したいときはいつでも 3 つの列すべてをチェックする必要がある

B. とうもろこし、大豆、穀物の表を組み合わせて、作物の種類を示す 1 つの列を追加します。

欠点:各テーブルには異なる列があり、各行に無駄な列と不要な列があります

私はここで立ち往生していると言っても過言ではありませんか? または、このようなケースを処理するための戦略はありますか? ありがとう。

4

2 に答える 2

2

これは「サブタイプ」の状況であり、Stephane Faroult の Art of SQL で広く取り上げられています。

推奨される解決策は、CropIDすべてのテーブル、、、および で同じ一意のキー (この場合は、たとえば ) をCrop使用することです。テーブルの主キーのセットは、との主キーの結合になります。さらに、各レコードのタイプを示すテーブルに、属性 (たとえば、 ) を定義します。このように、共通の属性はテーブルに残り、タイプ固有の属性は冗長性なしでタイプ固有のテーブルに移動します。CornSoybeanGrainCropCornSoyBeanGrainCropTypeCropCropCrop

于 2013-06-08T00:28:34.317 に答える