5

動物に関する情報を格納するために使用されるデータ構造があります。データの種類 (列) は動物の種類によって異なりますが、一般的なものはごくわずかです。さまざまな機能セットを持つ多くの動物タイプが存在する可能性があります (1 つのタイプで 1 つ以上の機能セットを実装できます)。

私が達成したいことは次のとおりです。

  1. 後でデータ構造を変更することなく、既存の機能セットに基づいて新しい動物タイプを作成する可能性がある

  2. 既知の animal_id を持つ動物または既知のタイプを持つすべての動物に関するすべてのデータを簡単に選択できるようにする

  3. データコントロールを持つため (たとえば、flying_animal に関するデータの挿入が動物タイプ「犬」には許可されないようにするため)

  4. 可能な限りシンプルで愚かな状態に保つため (もちろん、すべてのデータが正しいことを確認するために「挿入前」にいくつかのストアド プロシージャとトリガーを記述できますが、もっと洗練された方法があるのではないでしょうか?)

既存のデータ構造:

表:動物

animal_id (主キー)

動物の名前

動物の年齢

animal_type (animal_types テーブルの外部キー)

データ行の例:

1、「レックス」、3、2

表: animal_types

animal_type_id : int (主キー)

animal_type_name : 文字

-- 機能セットは次のとおりです。

house_animal : ブール値

Flying_animal : ブール値

wild_animal : ブール値

データ行の例:

1、「野生のオウム」、false、true、true

2、「犬」、真、偽、偽

すべての機能セットがテーブルとして実装されるようになりました。例:

表: house_animal

animal_id (animals テーブルの外部キー)

好きな食べ物

last_vet_visit_date

表:空飛ぶ動物

animal_id (animals テーブルの外部キー)

length_of_wings

マックス・スピード

現在のデータ構造は複雑すぎます。

考えられるすべての列を含む 1 つの大きなテーブルと、動物の種類を含む 1 つのディクショナリ テーブルを作成しない理由を私に尋ねることができます。もちろんできますが、それではデータ制御がほとんど不可能になり、一部の列のみを許可して新しい型を定義する方法..?

また、新しい型ごとに 1 つのテーブルを作成しないのはなぜでしょうか? たとえば、それぞれに数行しかない200個のテーブルを持ちたくないからです。

何か案は?

DBMS は PostgreSQL バージョン 9.1 です。

4

1 に答える 1

1

それを行う 1 つの方法は、異なる種類の動物ごとに 1 つのテーブルを作成しないことです。代わりに、各タイプが持つ機能を格納する animal_types を参照するテーブルを使用できます。次のようになります。

表:動物

animal_id (主キー)

動物の名前

動物の年齢

animal_type (animal_types テーブルの外部キー)

データ行の例:

1、「レックス」、3、2

: animal_types

animal_type_id : int (主キー)

animal_type_name : 文字

各タイプの許可された機能を格納するテーブル

: animal_types_features

animal_type_id : int (主キー) (animal_types テーブルの外部キー)

animal_type_feature_id : int (主キー)

animal_type_feature_name : 文字

そして、各動物の特徴を格納するテーブル:

表: animals_features

animal_id (表の動物への外部キー)

animal_type_id : (animal_types_features テーブルの外部キー)

animal_type_feature_id (animal_types_features テーブルの外部キー)

animal_feature_value : 文字

これは非常に単純な例です。追加できることの 1 つは、animal_type_features に、各機能に使用できる有効なデータを示すデータを格納する列を含めることができることです。この方法の利点は、アプリケーションやデータベースに追加の変更を加えることなく、新しい型を実装できることです。

于 2012-11-13T16:43:05.163 に答える