動物に関する情報を格納するために使用されるデータ構造があります。データの種類 (列) は動物の種類によって異なりますが、一般的なものはごくわずかです。さまざまな機能セットを持つ多くの動物タイプが存在する可能性があります (1 つのタイプで 1 つ以上の機能セットを実装できます)。
私が達成したいことは次のとおりです。
後でデータ構造を変更することなく、既存の機能セットに基づいて新しい動物タイプを作成する可能性がある
既知の animal_id を持つ動物または既知のタイプを持つすべての動物に関するすべてのデータを簡単に選択できるようにする
データコントロールを持つため (たとえば、flying_animal に関するデータの挿入が動物タイプ「犬」には許可されないようにするため)
可能な限りシンプルで愚かな状態に保つため (もちろん、すべてのデータが正しいことを確認するために「挿入前」にいくつかのストアド プロシージャとトリガーを記述できますが、もっと洗練された方法があるのではないでしょうか?)
既存のデータ構造:
表:動物
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 です。