11

動物というクラスがある場合、犬と魚がサブクラスです。動物には「色」と呼ばれる属性があります。犬には「尾の長さ」という属性があり、魚にはこの属性がありません。魚には「体重」と呼ばれる属性がありますが、犬にはこの属性がありません。

そこで、この情報を保存するデータベースを設計したいと思います。私は何をすべきか?ここにいくつかのアイデアがあります:

アイデア1:動物のテーブルを作成し、テーブルにはタイプがあります。犬の場合、犬のテーブルから結果を取得するだけで、どのような動物を見つけることができます。

動物:色:文字列タイプ:int

タイプ:犬:0魚:1

犬:TailLength:int

魚:体重:int

アイデア2:犬のテーブルと魚のテーブルのみをデータベースに保存し、動物のテーブルを削除します。

犬:色:文字列TailLength:int

魚:色:文字列重量:int

4

3 に答える 3

12

あなたが言及した2つのアプローチ:

  • 継承階層全体のオブジェクトを表す1つのテーブル。階層全体に必要なすべての列と、特定のオブジェクトがどのサブクラスであるかを示す「タイプ」列が含まれます。
  • スキーマが重複している、継承階層の具象クラスごとに1つのテーブル。

他の2つで補うことができます:

  • 継承階層のクラスごとに1つのテーブル–これでAnimalテーブルが作成され、サブクラスには、 Animalの共通データセットを指す外部キーを持つテーブルが作成されます。
  • 汎用スキーマ–オブジェクトを格納するためのテーブルと、そのオブジェクトにアタッチされた属性のセットをサポートするための属性テーブルがあります。

それぞれのアプローチには長所と短所があります。ここにそれらの良い要約があります:

これらのSOトピックもご覧ください。

最後に、データベース内のオブジェクトをより自然に表すオブジェクト指向データベース(別名オブジェクトデータベース、またはOODBMS)があり、この問題を簡単に解決できることに注意してください。ただし、それほど頻繁ではないと思います。業界で使用されます。リレーショナル(および他の)DBと比較したそのようなDBを説明するいくつかのリンクがありますが、それらは問題について完全に客観的な(heh)ビューを提供しません:

于 2010-07-05T16:50:13.963 に答える
0

あなたはこのようにそれを試すことができます:

Animal
    PK animal_id
    FK animal_type
    STRING animal_name (eg. 'Lassie')

AnimalTypes
    PK animal_type
    STRING animal_type_name (eg. 'Dog')

AnimalAttributes
    PK attribute_id
    STRING attribute_name (eg. 'tail length')

AnimalToAttributes
    PK id
    FK animal_id
    FK attribute_id
    INTEGER value (eg. 20)

このようにして、動物ごとに1つまたは複数の属性を持つことができます(選択するのはあなた次第です)。

于 2010-07-05T16:29:14.917 に答える
0

1対0または1の関係を使用するお気づきのとおり、データベーススキーマ設計言語では、テーブルはクラス(サブクラスまたはスーパークラス)と呼ばれます。

   Create Table Animal
    (animalId Integer Primary Key Not null,
     Other columns generic to all animals)

   Create Table Birds
    (BirdId Integer Primary Key Not Null 
     references Animal(AnimalId),
     -- other columns)
于 2010-07-05T16:30:52.793 に答える