web-dev-qa-db-ja.com

データベースの正規化に関するアドバイスが必要

私はOracleで基本的な血液銀行データベースに取り組んでいます。完全に基本的な正規化されたテーブルを作成したいので、さらに詳細を追加します。私は2NFに対してそれを行い、その後さらに3NFに進みますが、最初に誰かが私の正規化を見て、それを改善するのを手伝ってくれるか(必要な場合)、またはそれに関するアドバイスを得ることができます。

my unnormalized and 1st nf normalized tables

2nd nf tables

1
Franco

@ joishi-bodioによる優れた点。

これは、モデル内のさまざまなエンティティ、属性、およびそれらの関係を説明する簡単な図です。

データベースをモデル化する最初のステップは、実際のエンティティを特定することです。各エンティティを定義する属性。次に、それらの関係と相互参照。

ここに、例から引き出すことができるさまざまな観察と結論があります-

エンティティと属性-

  • あなたの例を見ている最も明白な現実世界の実体はPERSONです。
  • エンティティPersonは、名前、年齢、性別、DOB、血液型などの属性で定義できます。
  • PERSONは、「献血者」または「献血者」、あるいはその両方にすることができます。 「ドナー」と「レシーバー」は、人が果たす役割が異なるように聞こえますが、それ自体は異なるエンティティではありません。
  • Blood Groupは別のエンティティである可能性があり、とりわけその血液型の名前で定義できます。
  • 病院では、血液は血液バッグに保管されます。血液バッグは、その血液バッグの提供者が誰であるかによって定義される別のエンティティである可能性があります。
  • Transactionsは、すべての血液トランザクションのストアである別のテーブルです。トランザクションは、日付に人(受信者)に割り当てられる血液バッグによって定義できます。

関係

  • すべての人が正確に1つの血液型を持っています。そのグループには0人または多数の人を含めることができます。
  • 各血液バッグには1人の血液が入っています。人は多くの血液バッグに血液を持っているかもしれませんし、持っていないかもしれません。
  • 0個以上の血液バッグをレシーバーに割り当てることができます。人は、1つまたは複数の血液バッグへのドナーである場合とそうでない場合があります。

次のようなものが得られます-

2
ruudvan

bloodgroupは、独自のテーブルに移動できます。blood_bagテーブルでは、bloodgroupの血液型と常に一致することを考えると、おそらくdonorはまったく必要ありません。同様に、transactionテーブルにはdonor_idは必要ありません。これは、常にblood_bagdonorと一致するためです。

なぜreceiverテーブルがあるのか​​よくわかりません...名前と血液型を記録するpersonテーブルが必要なだけです..次に、transactionテーブルdonor_idreceiver_idの両方が必要です。 personテーブルをポイントします。 (ただし、このテーブルにはdonor_idはまったく必要ありません。)

1
Joishi Bodio