2016-11-19 3 views
0

私は4つのテーブルを持っています。異なるテーブル内の冗長データが3NF正規化と壊れていますか?

  1. 人(ID(主キー)、名前、職業、場所、SecondJob、PerHour、HoursWorked、電話番号、はworkPhone)
  2. 仕事(人を指しID(外部キー):彼らは、次の属性を持っています、タイトル、名前、場所、給与)
  3. SecondJob(人を指しID(外部キー)、タイトル、名前)
  4. のPhoneNumber(人を指しID(外部キー)、名前、電話番号、はworkPhone)

各attriの値を取得します以下の疑似書かれた方法で、Personテーブルから名、タイトル、電話とはworkPhoneのようなビュート:

選択(属性名)IdをIN(PERSONS ID)

  1. が実際にその情報をい人から人別のテーブル(データ冗長性)で繰り返され、3NFの正規化を破る?

    他のテーブルに値を別に入れて、その属性がテーブルの主キーで識別されているかどうかを判断する必要がありますか?

  2. 私は、PerHourとHoursWorkedをPersonから取得して給与を計算し、それを乗算します。私はこれも冗長データであると聞きました。これは、テーブル内の既存のデータからデータを外挿することができるためです。

    しかし、3NFの正規化を解除しますか?

+1

これは正規化の点では壊れています。なぜ "名前"がどこに現れているのですか?その情報がPersonレコードに統合されていないのはなぜですか?パフォーマンス上の理由から意図的に非正規化を行っている場合は、このデータを同期させ、各フィールドの標準ソースを理解する方法がありますか? PhoneNumberに* 2 *の数字が含まれているのはなぜですか?あなたはここで多くの仕事をして細部を細分化しています。 – tadman

+1

あなたは[ゼロ、1つまたは無限](http://ja.wikipedia.org/wiki/Zero_one_infinity_rule)しか持っていないことを覚えておいてください。だから、テーブルとしての「セカンド・ジョー」は非常に懸念している。もし彼らが第三の仕事をしていたら?四番目? 19番?人々はキャリアを変え、昇進させられ、移転され、それは人々がN回切り替えることが期待される。同様に、給与情報は、人物ではなく職務に関連付ける必要があります。 – tadman

+0

あなたの応答のフィードバック: 1. 2番目のポストには実際に有効なポイントがありますが、「正規化の点では壊れました」などの点を指摘しています。 2. Secondjobは単なる名前です。それがどのように形成されているのか、いくつかの異なる仕事がそれを埋めることを可能にします - IDによる外部キー参照。 3.正規化は依然として主キーと前記キーのwholy識別に依存していました。データの重複がありました。しかし、電話の部分は、変更が必要です。 –

答えて

0

情報が異なるテーブル(データの冗長性)で繰り返されるという事実は、3NF正規化に対して壊れていますか?

いいえ表の値または変数は、指定されたNFに含まれるかどうかです。これは他のテーブルとは無関係です。 (データベースがすべてNFにある場合は、データベースがNFにあることについても話します。)

正規化は、冗長性を除去するために合理的に言えます。しかし、正規化によって対処されていない多くの冗長性があります。そして、冗長性がたくさんあり、それは悪くありません。また、重複は必ずしも冗長性ではありません。ただデータが繰り返されているので、「情報」が繰り返されるわけではありません。テーブル内にあるかどうかによってデータが示すことは、テーブルの意味によって異なります。

しかし、違うテーブルのデータを複製しても3NFに違反しないという理由だけで、良いデザインの他の原則に違反しないと考えるようです。それは間違っている。また、重要な5NFです。 NFが低い唯​​一の理由は、SQL DBMSが5NFをうまくサポートしていないことです。

他のテーブルに値を入れて、別のテーブルのプライマリキーでどのような属性が識別されているのだろうか?

私は値を1つのテーブルにそれぞれ入れて、共有キーを含むクエリを介して2番目のテーブルを再構築する必要がありますか?つまり、データベースの残りの部分を照会して列の値を取得できる場合は、その列を持たないようにする必要がありますか?一般的に言えば、はい。

あなたの質問は誤解されています。それは "(排他的な)または"の問題ではない。両方をする必要があります。

私は、PerHourとHoursWorkedをPersonから取得して給与を計算してから掛けます。私はこれも冗長データであると聞きました。これは、テーブル内の既存のデータからデータを外挿することができるためです。

代わりにクエリを使用できるため、残りのデータベースでは冗長です。給与額を適切に制限しないと、冗長性が悪化します。たとえ列や制約を行っても、スキーマが複雑になります。

しかし、3NFの正規化を解除しますか?

いいえ。テーブルのNFが他のテーブルと独立しているためです。しかしそれはそれが大丈夫であることを意味しません。

(あなたは人に給与を追加した場合は、新しいテーブルが3NFではないだろう。しかし、その後、SQLのDBMSは、給与と3NFのビューを非3NFテーブルを作ることで、それがOKにする計算列を持っていますテーブルなし)

いくつかのデータベース設計方法と、それらがどのように優れた設計の原則を適用するかを学びます。あなたのテーブルは、アプリケーションの重複する側面に不必要に対処します。また、クエリを書く際のJOINについても学びます。

関連する問題