2

次の列を持つテーブルがあるとします。

  • person_id (主キー)
  • ファーストネーム
  • 苗字
  • 誕生日

{first_name, last_name} の組み合わせにも一意の制約があります (同じ名前を持つ人が増えることはわかっていますが、例を単純にしたいと思います)。この表が第 3 正規形かどうかを知りたいです。


私の推論(編集前):

  • すべてのフィールドにはアトミック値のみを含めることができるため、テーブルは第 1 正規形になります。
  • 候補キーは、1) person_id、2) [first_name, last_name] です。
  • 非プライム属性は誕生日だけです。
  • 属性誕生日は、候補キー 1 の一部に機能的に依存していません (候補キー 1 には属性が 1 つしかないため、これはとにかく不可能です)。
  • 属性誕生日は、候補キー 2 の一部に機能的に依存していません
  • したがって、この表は第 2 正規形です。
  • 属性 birthday (is/is not) は候補キー 1 に非推移的に依存します
  • 属性 birthday は、候補キー 1 に非推移的に依存しています。

質問(編集前):

私が答えられない質問は、誕生日が非推移的に person_id に依存しているかどうかです。機能的には、この ID 番号と誕生日の間にはまったく関係がありません。

  1. これは、推移的な依存関係 (誕生日は [first_name, last_name] に依存し、各組み合わせ [first_name, last_name] は ID にマップされる) があり、したがって 3NF ではないことを意味しますか?
  2. これは、依存関係がまったくないということであり、したがって 3NF ではないということですか?
  3. 私は難しい言葉を誤解していますか? この表は 3NF ですか?

私の推論(編集後):

  • person_id がわかれば、彼の名、姓、誕生日がわかるので、FD には {pe​​rson_id} -> {first_name}、{person_id} -> {last_name}、{person_id} -> {birthday} があります。
  • 人の名前と姓がわかれば、その人の person_id と誕生日がわかるので、FD {first_name, last_name} -> {person_id} と {first_name, last_name} -> {birthday} があります。
  • 人の誕生日を知っている場合、その人の person_id や名前については何も知らないため、誕生日から別の (セットの) 属性への FD はありません。

  • すべてのフィールドにはアトミック値のみを含めることができるため、テーブルは第 1 正規形になります。

  • 候補キーは 1) {person_id}、2) {first_name, last_name} です。
  • 非プライム属性は {birthday} だけです。
  • 属性 {birthday} は、CK 1 の一部の FD ではありません (CK 1 には属性が 1 つしかないため、とにかく不可能です)。
  • 属性 {birthday} は CK 2 の一部で FD ではありません
  • したがって、この表は第 2 正規形です。

  • FD {person_id} -> {birthday} があるため、属性 {birthday} は CK 1 に非推移的に依存します。

  • FD {first_name, last_name} -> {birthday} があるため、属性 {birthday} は CK 2 に非推移的に依存します。
  • したがって、この表は第 3 正規形です。

依存関係 {person_id} -> {first_name, last_name} -> {birthday} がありますが、直接の依存関係 {person_id} -> {birthday} もあるため、この依存関係は推移的ではありません。

質問(編集後):

私は本の FD の事前定義されたセットを持っていないので、FD が正しいかどうかわかりません。誰かがこれを確認できますか、または正しく見えない場合は、この実際の例で FD を見つける方法を示してもらえますか?


3 番目の推論 (2 回目の編集):

FD:

  • 人物の person_id しか知らない場合は、その人物の名、姓、誕生日がわかります (同じ person_id を持つ人物が複数存在することはありません)。
    • FD: {person_id} -> {first_name}
    • FD: {person_id} -> {last_name}
    • FD: {person_id} -> {誕生日}
  • {person_id} を含むスーパーセットを考慮する必要がなくなりました
  • 人の名のみを知っている場合、この人の他のフィールドはわかりません (同じ名を持つ人が複数いる可能性があります)。
    • FD ではない: {first_name} -> {person_id}
    • FD ではない: {first_name} -> {last_name}
    • FD ではない: {first_name} -> {birthday}
  • 人物の last_name しか知らない場合、この人物の他のフィールドはわかりません (同じ last_name を持つ人物が複数存在する可能性があります)。
    • FD ではない: {last_name} -> {person_id}
    • FD ではない: {last_name} -> {first_name}
    • FD ではない: {last_name} -> {birthday}
  • ある人の誕生日しか知らない場合、その人の他のフィールドはわかりません (同じ誕生日の人が複数いる可能性があります)。
    • FD ではない: {birthday} -> {person_id}
    • FD ではない: {誕生日} -> {first_name}
    • FD ではない: {誕生日} -> {姓}
  • 人の姓と名がわかれば、その人物の ID と生年月日がわかります (姓名が同じ人が複数存在することはありません)。
    • FD: {first_name, last_name} -> {person_id}
    • FD: {名、姓} -> {誕生日}
  • {first_name, last_name} を含むスーパーセットを考慮する必要がなくなりました
  • 人の名前と誕生日がわかっている場合、この人の他のフィールドはわかりません (同じ名前と誕生日を持つ人が複数いる可能性があります)。
    • FD ではない: {first_name, birthday} -> {person_id}
    • FD ではない: {first_name, birthday} -> {last_name}
  • 人物の姓と誕生日がわかっている場合、この人物の他のフィールドはわかりません (姓と誕生日が同じ人物が複数存在する可能性があります)。
    • FD ではない: {last_name, birthday} -> {person_id}
    • FD ではない: {last_name, birthday} -> {first_name}

通常形:

  • すべての属性には単一の値のみを含めることができるため、テーブルは第 1 正規形です。

  • FD を見ると、1) {person_id}、2) {first_name, last_name} の 2 つの候補キーがあります。

  • 非プライム属性は {birthday} だけです。
  • 属性 {birthday} は、CK 1 の一部の FD ではありません (CK 1 には属性が 1 つしかないため、とにかく不可能です)。
  • 属性 {birthday} は、CK 2 の一部の FD ではありません (つまり、FD {first_name} -> {birthday} または FD {last_name} -> {birthday} はありません)。
  • したがって、この表は第 2 正規形です。

  • S -> X かつ X -> T かつ not(X -> S) となるような X が存在する場合、S は推移的に T を決定します。

  • S = CK1 = {person_id} および T = {birthday} とします。S -> X および X -> T となる唯一の X は、X = {first_name, last_name} の場合です。ただし、X -> S も成立します。したがって、S は非推移的に T を決定します。
  • S = CK2 = {first_name, last_name} および T = {birthday} とします。S -> X および X -> T となる X は、X = {person_id} の場合のみです。ただし、X -> S も成立します。したがって、S は非推移的に T を決定します。
  • したがって、この表は第 3 正規形です。
4

1 に答える 1

3

元の質問について:

あなたの組織と推論は健全ではありません。最初にすべての FD を指定します。たとえば、これにより CK が決定されます。たとえば、(主張されている) CK (特定の FD を意味する) といくつかの非 FD を与えるだけでは、適切に推論することはできません。たとえば、「非推移的依存」は、すべての FD を知らなければ決定できません。そうして初めて、サウンドブレットを書き、番号付きの質問に答えることができます。

しかし、{first_name,last_name} と {person_id} が実際には唯一の CK であり、各 CK がそこにないすべての属性を決定するという事実によって暗示される以外の FD はないと仮定しましょう。

機能的には、この ID 番号と誕生日の間にはまったく関係がありません。

「機能的にはまったく関係がない」というのが何を意味するのかわかりません。{person_id} は機能的に {birthday} を決定しないと言いたいのかもしれません。ただし、CK はその中にないすべての属性を決定するためです。おそらく、人の ID と誕生日の間のアプリケーションの制約や、テーブルの person_id と誕生日の値を含むテーブルの制約が表示されないことを意味します。ただし、特定の人物の誕生日は一度に 1 つだけであり、テーブル内の person_id の誕生日は一度に 1 つだけです。これは、"people"、"birthday"、person_id、および birthday の意味とルールの結果です。person_id と birthday の制約は、「{person_id} -> {birthday}」で表されます。

S は、S -> X かつ X -> Tかつnot(X -> S)となるような X が存在する場合、T を推移的に決定します。S が T を推移的に決定しない場合、S は T を非推移的に決定します。

  1. これは、推移的な依存関係 (誕生日は [first_name, last_name] に依存し、各組み合わせ [first_name, last_name] は ID にマップされる) があり、したがって 3NF ではないことを意味しますか?

非 3NF を意味する理由は言うまでもなく、「各組み合わせが ID にマップされる」ということで何を言おうとしているのかわかりません。{person_id} を S として、{birthday} を T として、{first_name, last_name} を X として、S -> X および X -> T があると言いたいのかもしれません。 CK にあるため、関係は 3NF にありません。しかし、あなたは not(X -> S) を満足しませんでした。

{person_id} が S で {birthday} が T の場合、X -> T の唯一の可能性は {first_name,last_name} が X ですが、X -> S は X がキーであるため、S -> T は推移的ではありません。

同様に、{first_name,last_name} が S で {birthday} が T の場合、X -> T の唯一の可能性は {pe​​rson_id} が X ですが、X -> S は X がキーであるため、S -> T は推移的ではありません。

  1. これは、依存関係がまったくないということであり、したがって 3NF ではないということですか?

2NF の関係とすべての非素数属性はすべての CK に非推移的に依存するため、関係は 3NF になります。

  1. 私は難しい言葉を誤解していますか? この表は 3NF ですか?

あなたはそれがあったかどうかを主張しませんでしたね?

(適切な技術用語を使用するように質問を編集してください。)

あなたのEDITバージョンを再

(あなたはコメントで、あなたの最後の弾丸には CK 2 が含まれているはずであり、それが不健全であることを認めました。そして、あなたの不明確な言い回しに対する私の推測は、多かれ少なかれあなたが意図したものでした.)

  • すべてのフィールドにはアトミック値のみを含めることができるため、テーブルは第 1 正規形になります。

正規化は、リレーショナル「テーブル」、つまりリレーションに対してのみ意味があります。これは、順序付けされていない固有の属性 (「列」) とタプル (「行」) を意味します。タプルごとに属性ごとに 1 つの値を持つ。すべての関係は 1NF にあります。:

リレーショナル テーブルは常に 1NF にあります。行の各列には、列の型の単一の値があります。非リレーショナル データベースは、テーブルに対して「正規化」されます。つまり、繰り返しグループを取り除く 1NF (「正規化」の第一の意味) です。次に、それらのテーブル/関係は、より高い正規形に「正規化」されます (「正規化」の第 2 の意味)。

"Atomic" は役に立ちません: "Atomic" はもともと関係を意味していませんでした。:

Codd の 1970 年の最初の論文で、彼は「アトミック」は関係 (つまり、テーブルではない) を意味しないと説明しました。

これまで、単純なドメイン (要素がアトミック (分解不可能) 値であるドメイン) で定義されている関係の例について説明してきました。非原子値は、リレーショナル フレームワーク内で議論できます。したがって、一部のドメインは要素として関係を持つ場合があります。

Codd の 1990 年の書籍The Relational Model for Database Management: Version 2 の時点で:

データベースの観点から、データは原子と複合の 2 つのタイプに分類できます。

リレーショナル モデルでは、複合データのタイプは 1 つだけです: リレーションです。

リレーションは単一の値であるため、リレーション値属性に問題はありません。(それに関するペース・コッドの意見の変化。)

  • 候補キーは 1) {person_id}、2) {first_name, last_name} です。
  • 非プライム属性は {birthday} だけです。

正規化するには、属性のすべてのサブセットについて、どの属性が (自明ではない) 機能的にそれに依存しているかを知る必要があります。行列式のすべてのスーパーセットはそれが何をするかを決定しますが、それはそれらの多くを処理します。あなたはそのステップをスキップしました。

{first_name} と {last_name} が CK ではないことをそれぞれが決定することによって示さなければ、{first_name,last_name} が CK であることを示すことはできません。仮にそうするとしても、残りの可能性のある決定要因 {first_name,birthday} と {last_name,birthday} をまだ考慮していないことになります。

他の CK がないことを示すまで、それらが唯一の CK であることを示すことはできません。属性のすべてのサブセットについて、それが CK であるかどうかを示す必要があります。CK のスーパーセットは CK ではありませんが、それで多くの処理が行われます。アルゴリズムがあります。

  • FD {person_id} -> {birthday} があるため、属性 {birthday} は CK 1 に非推移的に依存します。
  • FD {first_name, last_name} -> {birthday} があるため、属性 {birthday} は CK 2 に非推移的に依存します。

新しい最後の 2 つの箇条書きは不当です。私のメッセージの定義と「(非) 推移的依存」の使用を見てください。S -> T を知っているだけでは十分ではありません。非推移的な FD S -> X -> T がある場合、それは S -> T でなければなりません。したがって、S -> T だけを知っていても、S が T を推移的に決定するか非推移的に決定するかについてはわかりません。「->」は「直接」を意味しません。非推移的には、「直接」の唯一の意味のある概念です。

たぶん、「そう」とは、「これら2つのケースのうちの最初のものについて以下に示すように」という意味ですか?

依存関係 {person_id} -> {first_name, last_name} -> {birthday} がありますが、直接の依存関係 {person_id} -> {birthday} もあるため、この依存関係は推移的ではありません。

上記を参照してください:「直接」は誤解です。元の回答で言ったように、CK1 の {first_name, last_name} -> {person_id} と CK 2 の {person_id} -> {first_name, last_name} 以降です。

私は本の FD の事前定義されたセットを持っていないので、FD が正しいかどうかわかりません。誰かがこれを確認できますか、または正しく見えない場合は、この実際の例で FD を見つける方法を示してもらえますか?

発生する可能性のあるすべてのアプリケーション状況と、行をテーブルに入れるか除外するかの基準 (述語) のために、テーブルが持つことができるすべての可能な値を考慮する必要があります。おそらく、2 つの行が推定行列式に対して同じ値を共有できる、推定 FD の反例を考えることができます。たとえば、{first_name,birthday} と {last_name,birthday} の場合、2 人の異なる人が同じ名前と誕生日を持つことが期待できます。(最後の 2 つの推定 FD を確認できます。)

(これで、あなたの言葉はより明確になりました。大まかに言えば、(まだ)エラーは、定義を使用せず、手順をスキップしたことに起因します。)

2番目のEDITバージョンを再:

あなたはおそらくすべてをしっかりと行ったようです。(ただし、2 要素の属性セットがこれ以上存在しないこと、および属性セットがこれ以上存在しないことを具体的に明確にしていないため、確かなことはわかりません。そのペアが CK のセットである理由、および 2NF/3NF "したがって」

「人の名字と誕生日を知っていれば、この人の他のフィールドはわかりません」などの言い回しは問題があります。私: 2 つの分野しか知らない場合、もちろん他の分野は知りません。FDはないの?あなた:人のために。私: でも、その人を知っていれば、その人の first_name はわかります。FDはありますか?あなた: 1 人の名前と生年月日を知っているが誰であるかがわからない場合。あなたは他の分野を知りません。私: 他の分野を知っていることもあります。したがって、その意味は誤りです。FDあるの?「知っている」という言葉は非常に紛らわしいので、避けたほうがよいことがわかりました。「与えられた...存在する...」と書きます。「(複数存在することはできません...)」で行ったように。

于 2014-11-29T03:18:47.793 に答える