次の例は、私が直面している問題を示しています。
動物には人種があり、猫または犬のいずれかになります。 CatはSiameseまたはPersianのいずれかです。 Dogはドイツ語羊飼いまたはLabrador retriverになります。
動物は強力なエンティティですが、人種は2つの提供された値(猫または犬)のいずれかを持つことができる属性ですこれらの値はどちらも複雑です(ここでのみ追加しました)問題を説明するための犬/猫のタイプですが、猫/犬の名前やその他の要素もある場合があります)
この例では、リレーショナルテーブルを作成する方法がわかりません。
問題を表す陳の表記法を使用してERダイアグラムを描画しようとしましたが、初心者であるため、正しく行ったかどうかはわかりません。ここに私が持っているものがあります:
間違ったものを描いた場合はお詫び申し上げます。その場合は訂正してください。私は単に「無料の解決策」を手に入れたいのではなく、将来この問題を自分で解決できるようにこの問題に対処する方法を学びたいと思っています。
頭に浮かぶのは、猫用と犬用の2つの別々のテーブルを作成することだけです。また、Animalテーブルのrace属性は、catまたはdog値のみを格納します。このようなもの:
Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >
私は自分の解決策について本当に気分が悪く、それが間違っているのではないかと思っています。
さらに詳しい情報が必要な場合はコメントを残してください。できるだけ早く投稿を更新します。ここではかなり新しいので、適切なタグを追加してもかまいません。
ありがとうございました。
まず、ERモデリングとリレーショナルモデリングを区別するためにうまくやっています。多くの初心者はそうしません。
以下は、ウェブ上の役立つ記事を検索するために使用できる流行語です。
あなたのケースは、クラス/サブクラスの古典的なケース、または必要に応じてタイプ/サブタイプです。
ERモデリングで使用されるフレーズは「一般化/専門化」です。そして、多くの記事は、EER(Enhanced Entity-Relationship)モデリングと呼ばれるものの下でこれを示しています。これは、ピーターチェンによるERモデリングの元のプレゼンテーションにはありませんでした。後で追加されました。 PDF形式でのgen/specのかなり良い要約については、 ここをクリック
次に、クラス/サブクラスのケースをリレーショナルモデリングに変換するときに、テーブルを設計します。複数のアプローチがあります。 2つの主要なアプローチは、単一テーブル継承とクラステーブル継承と呼ばれます。それぞれに長所と短所があります。これら2つのデザインの最も優れたプレゼンテーションは、Martin Fowlerによるものです。彼の概要 here と here を見ることができます。
単一テーブル継承の大きな利点は、単純さです。すべて1つのテーブルに格納されています。大きな欠点は、NULLが多いことです。これはスペースと時間を浪費し、ロジックを混乱させる可能性があります。
クラステーブルの継承には結合が必要ですが、結合は単純で高速です。特に、共有主キーと呼ばれる手法を使用する場合、サブクラステーブルのPKはスーパークラステーブルのPKのコピーになります。スーパークラスデータとサブクラスデータを結合するサブクラスごとにビューを作成できます。
最後に、この領域には、あなたのような質問をまとめて収集するタグがあります。
ここにあります: サブタイプ
私は可能なデザインについて
テーブルRace
RaceId- PK- Int
RaceName - Varchar(50)
テーブルBreed
BreedId - PK- Int
RaceId - FK - Int
BreedName - varchar(50)
テーブルAnimal
AnimalId - PK- Int
BreedId - FK - Int
Other Columns....
上記のこれらのPKは、自動インクリメント列になります。 Animal
テーブルの他の列には、それに応じた名前を付けることができます。
あなたの現在の方法は悪くありません。ただし、後でレース(鳥、魚など)を追加する場合は、それぞれに個別のテーブルを作成するのが面倒な場合があります。私は次のようなものをお勧めします:
Animal < # Animal_ID, Breed_ID, other attributes >
Breed < # Breed_ID, Race_ID >
Race < # Race_ID >
品種は、私の理解では、人種は1つだけです。したがって、動物のテーブルに品種を保存すると、品種テーブルに参加することでレースを決定できます。明らかに、必要に応じて、他の属性(名前、説明など)をBreedテーブルとRaceテーブルに追加します。