web-dev-qa-db-ja.com

変数エンティティをリレーショナルテーブルに変換する方法がわからない

はじめにおよび関連情報:

次の例は、私が直面している問題を示しています。

動物には人種があり、またはのいずれかになります。 CatSiameseまたはPersianのいずれかです。 Dogドイツ語羊飼いまたはLabrador retriverになります。

動物は強力なエンティティですが、人種は2つの提供された値(猫または犬)のいずれかを持つことができる属性ですこれらの値はどちらも複雑です(ここでのみ追加しました)問題を説明するための犬/猫のタイプですが、猫/犬の名前やその他の要素もある場合があります)

問題:

この例では、リレーショナルテーブルを作成する方法がわかりません。

問題を解決するための私の努力:

問題を表す陳の表記法を使用してERダイアグラムを描画しようとしましたが、初心者であるため、正しく行ったかどうかはわかりません。ここに私が持っているものがあります:

enter image description here

間違ったものを描いた場合はお詫び申し上げます。その場合は訂正してください。私は単に「無料の解決策」を手に入れたいのではなく、将来この問題を自分で解決できるようにこの問題に対処する方法を学びたいと思っています。

頭に浮かぶのは、猫用と犬用の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図をリレーショナルテーブルに変換する方法は?

さらに詳しい情報が必要な場合はコメントを残してください。できるだけ早く投稿を更新します。ここではかなり新しいので、適切なタグを追加してもかまいません。

ありがとうございました。

まず、ERモデリングとリレーショナルモデリングを区別するためにうまくやっています。多くの初心者はそうしません。

以下は、ウェブ上の役立つ記事を検索するために使用できる流行語です。

あなたのケースは、クラス/サブクラスの古典的なケース、または必要に応じてタイプ/サブタイプです。

ERモデリングで使用されるフレーズは「一般化/専門化」です。そして、多くの記事は、EER(Enhanced Entity-Relationship)モデリングと呼ばれるものの下でこれを示しています。これは、ピーターチェンによるERモデリングの元のプレゼンテーションにはありませんでした。後で追加されました。 PDF形式でのgen/specのかなり良い要約については、 ここをクリック

次に、クラス/サブクラスのケースをリレーショナルモデリングに変換するときに、テーブルを設計します。複数のアプローチがあります。 2つの主要なアプローチは、単一テーブル継承とクラステーブル継承と呼ばれます。それぞれに長所と短所があります。これら2つのデザインの最も優れたプレゼンテーションは、Martin Fowlerによるものです。彼の概要 herehere を見ることができます。

単一テーブル継承の大きな利点は、単純さです。すべて1つのテーブルに格納されています。大きな欠点は、NULLが多いことです。これはスペースと時間を浪費し、ロジックを混乱させる可能性があります。

クラステーブルの継承には結合が必要ですが、結合は単純で高速です。特に、共有主キーと呼ばれる手法を使用する場合、サブクラステーブルのPKはスーパークラステーブルのPKのコピーになります。スーパークラスデータとサブクラスデータを結合するサブクラスごとにビューを作成できます。

最後に、この領域には、あなたのような質問をまとめて収集するタグがあります。
ここにあります: サブタイプ

4
Walter Mitty

私は可能なデザインについて

テーブル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テーブルの他の列には、それに応じた名前を付けることができます。

enter image description here

3
vijayp

あなたの現在の方法は悪くありません。ただし、後でレース(鳥、魚など)を追加する場合は、それぞれに個別のテーブルを作成するのが面倒な場合があります。私は次のようなものをお勧めします:

Animal < # Animal_ID, Breed_ID, other attributes >
Breed < # Breed_ID, Race_ID >
Race < # Race_ID >

品種は、私の理解では、人種は1つだけです。したがって、動物のテーブルに品種を保存すると、品種テーブルに参加することでレースを決定できます。明らかに、必要に応じて、他の属性(名前、説明など)をBreedテーブルとRaceテーブルに追加します。

0
DavidN