私は引用を読みました:データはキー[1NF]、キー全体[2NF]に依存し、キー[3NF]以外は何もありません。
しかし、私は3.5NFまたはBCNFと呼ばれるように理解するのに苦労しています。ここに私が理解していることがあります:
では、なぜいくつかの3NFテーブルがBCNFにないのですか?つまり、3NFの引用では、明示的に「キー以外は何もありません」ということは、すべての属性が主キーのみに依存していることを意味しています。結局、主キーは、主キーとして選択されるまで候補キーです。
これまでの私の理解に関して何かおかしなことがあれば、私を修正してください。あなたが提供できる助けをありがとう。
ピザには、正確に3つのトッピングタイプがあります。
そこで、2つのピザを注文し、次のトッピングを選択します。
Pizza Topping Topping Type
-------- ---------- -------------
1 mozzarella cheese
1 pepperoni meat
1 olives vegetable
2 mozzarella meat
2 sausage cheese
2 peppers vegetable
ちょっと待ってください。モッツァレラチーズはチーズにも肉にもなり得ません!そして、ソーセージはチーズではありません!
モザレラalwaysチーズにするには、この種の間違いを防ぐ必要があります。これには別のテーブルを使用する必要があります。そのため、その事実を1か所だけに書き留めます。
Pizza Topping
-------- ----------
1 mozzarella
1 pepperoni
1 olives
2 mozzarella
2 sausage
2 peppers
Topping Topping Type
---------- -------------
mozzarella cheese
pepperoni meat
olives vegetable
sausage meat
peppers vegetable
それが、8歳の人が理解できる説明でした。これは、より技術的なバージョンです。
BCNFは、複数の候補キーが重複している場合にのみ3NFとは異なる動作をします。
理由は、Y
がX
のサブセットである場合、機能的な依存関係X -> Y
はもちろんtrueであるためです。したがって、候補キーが1つだけで3NFにあるテーブルでは、そのキー以外に機能的に依存する列(キーまたは非キー)がないため、すでにBCNFにあります。
各ピザには各トッピングタイプが1つずつ必要であるため、(ピザ、トッピングタイプ)が候補キーであることがわかります。また、特定のトッピングが同時に異なるタイプに属することはできないことを直感的に知っています。 (Pizza、Topping)は一意である必要があるため、候補キーでもあります。そのため、2つの候補キーが重複しています。
Mozarellaを間違ったトッピングタイプとしてマークした異常を示しました。これが間違っていることはわかっていますが、間違っているルールは、このテーブルのBCNFの有効な依存関係ではない依存関係Topping -> Topping Type
です。これは、候補キー全体以外の何かに対する依存関係です。
したがって、これを解決するために、PizzasテーブルからTopping Typeを取り出し、Toppingsテーブルの非キー属性にします。
微妙な違いは、3NFがキー属性と非キー属性(non-prime属性とも呼ばれる)を区別するのに対し、BCNFは区別しないことです。
これは、3NFの Zanioloの定義 を使用して最もよく説明されます。これはCoddの場合と同等です。
関係Rは、Rによって満たされるすべての非自明なFD(X-> A)に対して3NFであり、少なくとも次の条件の1つが当てはまります。
(a)XはRのスーパーキー、または
(b)AはRのキー属性です
BCNFは(a)を必要としますが、(b)をそれ自体の特別なケースとして扱いません。言い換えれば、BCNFでは、依存する属性がキーの一部である場合でも、すべての重要な決定要因がスーパーキーであることを要求します。
リレーションRは、次の条件が満たされる場合にRによって満たされるすべての非自明なFD(X-> A)に対してBCNFにあります。
(a)XはRのスーパーキーです
したがって、BCNFはより厳密です。
違いは非常に微妙であるため、3NFとして多くの人が非公式に説明しているのは、実際にはBCNFです。たとえば、3NFは「データはkey [s] ...に依存し、key [s]のみに依存する」という意味ですが、これは3NFではなくBCNFの非公式な記述です。 3NFは、「非キーデータはキーに依存し、...キーにのみ依存する」とより正確に説明できます。
あなたはまた述べた:
3NFの引用では、明示的に「キー以外は何もありません」ということは、すべての属性が主キーのみに依存していることを意味しています。
それは単純化しすぎです。 3NFおよびBCNFおよびすべての標準形は、1つの「プライマリ」キーだけでなく、all候補キーおよび/またはスーパーキーに関係します。
BCNF定義を使用する
すべての依存関係X→Yの場合にのみ、以下の条件の少なくとも1つが成り立ちます:
および3NF定義
機能的な依存関係X→Aのそれぞれについて、次の条件の少なくとも1つが成り立つ場合にのみ:
一方、
どこで
つまり、候補キーの部分的なサブセット(完全なセットを除く非自明なサブセット)は、スーパーキー以外の機能に依存することはできません。
BCNFにないテーブル/リレーションは、ピザの例で別のユーザーが言及した更新の異常などの異常の影響を受けます。残念ながら、
現在、違いの例は、ウィキペディアの「 BCNF(Boyce–Codd normal form))を満たしていない3NFテーブル 」で見つけることができます。部分キー/プライム属性)は、「レートタイプ」(notではないスーパーキーである部分キー/プライム属性)に依存します。これは、データベースのクライアントに問い合わせることで決定できる依存関係です。 、テニスクラブ:
今日のテニスコートの予約(NF、notBCNF)
Court Start Time End Time Rate Type
------- ---------- -------- ---------
1 09:30 10:30 SAVER
1 11:00 12:00 SAVER
1 14:00 15:30 STANDARD
2 10:00 11:30 PREMIUM-B
2 11:30 13:30 PREMIUM-B
2 15:00 16:30 PREMIUM-A
テーブルのスーパーキーは次のとおりです。
S1 = {Court, Start Time}
S2 = {Court, End Time}
S3 = {Rate Type, Start Time}
S4 = {Rate Type, End Time}
S5 = {Court, Start Time, End Time}
S6 = {Rate Type, Start Time, End Time}
S7 = {Court, Rate Type, Start Time}
S8 = {Court, Rate Type, End Time}
ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey
NF問題:部分キー/プライム属性「Court」は、スーパーキー以外のものに依存しています。代わりに、部分的なキー/プライム属性「レートタイプ」に依存します。つまり、裁判所をアップグレードする場合、ユーザーは手動で料金タイプを変更する必要があります。料金変更を適用する場合は、手動で裁判所を変更する必要があります。
(技術的には、「レートタイプ」->「コート」機能依存関係が違反されないことを保証できません。)
BCNFソリューション:上記のテーブルをBCNFに配置する場合、指定されたリレーション/テーブルを次の2つのリレーション/テーブルに分解できます(レートタイプが裁判所のみに依存していることがわかっていると仮定します)データベースのクライアント、テニスクラブのオーナーに尋ねることで発見できるメンバーシップステータス):
Rate Types(BCNFおよびBCNFによって暗示されるより弱い3NF)
Rate Type Court Member Flag
--------- ----- -----------
SAVER 1 Yes
STANDARD 1 No
PREMIUM-A 2 Yes
PREMIUM-B 2 No
Today's Tennis Court Bookings(BCNFおよびBCNFによって暗示されるより弱い3NF)
Member Flag Court Start Time End Time
----------- ----- ---------- --------
Yes 1 09:30 10:30
Yes 1 11:00 12:00
No 1 14:00 15:30
No 2 10:00 11:30
No 2 11:30 13:30
Yes 2 15:00 16:30
問題解決:裁判所をアップグレードした場合、料金タイプにこの変更が反映されることを保証でき、裁判所に間違った価格を請求することはできません。
(技術的には、機能の依存関係「レートタイプ」->「コート」に違反しないことを保証できます。)
すべての良い答え。単純な言語で表現するには[BCNF]部分キーはキーに依存できません。
つまり、候補キーの部分的なサブセット(つまり、完全なセットを除く任意の非自明なサブセット)は、機能的にいくつかの候補キーに依存することはできません。
「smartnut007」、「Bill Karwin」、および「sqlvogel」による回答が優れています。しかし、興味深い見方をしてみましょう。
さて、プライムキーと非プライムキーがあります。
非素数が素数に依存する方法に注目すると、次の2つのケースが見られます。
非素数は依存する場合もしない場合もあります。
依存していない場合:非依存または推移的な依存関係がある可能性があります
素数間の依存関係はどうですか?
ご覧のとおり、2番目または3番目のNFによるprimes間の依存関係は扱っていません。さらに、そのような依存関係がある場合、それは望ましくないため、それに対処するための単一のルールがあります。これはBCNFです。
ここにあるBill Karwinの投稿の例を参照すると、「Topping」と「」の両方に気付くでしょう。 Topping Type 'は主キーであり、依存関係があります。それらが依存関係を持つ非素数であれば、3NFが作動していました。
注:
BCNFの定義は非常に一般的であり、素数と素数の間で属性を区別しません。それでも、上記の考え方は、2番目と3番目のNFの後でも異常が浸透する様子を理解するのに役立ちます。
高度なトピック:ジェネリックBCNFを2NFおよび3NFにマッピング
BCNFがプライム/非プライム属性を参照せずに一般的な定義を提供することがわかったので、BCNFと2/3 NFがどのように関連するかを見てみましょう
最初に、BCNFでは、機能的な依存関係X -> Y
(FD)ごとに、Xがスーパーキーであることを(些細な場合を除いて)要求します。 FDのみを考慮する場合、3つのケースがあります-(1)XとYの両方が非素数、(2)両方の素数と(3)Xの素数とYの非素数、(無意味な)ケースX nonの破棄-primeおよびY prime。
ケース(1)の場合、3NFが処理します。
ケース(3)の場合、2NFが処理します。
(2)の場合、BCNFの使用が見つかります
これは価値のある答えを含む古い質問ですが、3NFの問題を示す実際の例を見つけるまでは、まだ少し混乱していました。 8歳の子供には向かないかもしれませんが、助けになるといいのですが。
明日は、四半期に一度の親と教師のミーティングで長女の先生に会います。日記は次のようになります(名前と部屋が変更されました)。
Teacher | Date | Room
----------|------------------|-----
Mr Smith | 2018-12-18 18:15 | A12
Mr Jones | 2018-12-18 18:30 | B10
Ms Doe | 2018-12-18 18:45 | C21
Ms Rogers | 2018-12-18 19:00 | A08
部屋ごとに教師は1人しかいません。 (1)すべての属性Teacher
、Date
、Room
については、行ごとに1つの値しかありません。 (2)スーパーキーは:(Teacher, Date, Room)
、(Teacher, Date)
、および(Date, Room)
であり、候補キーは明らかに(Teacher, Date)
および(Date, Room)
です。
(Teacher, Room)
はスーパーキーではありません。次の四半期にテーブルを完成させ、このような行があるかもしれません(スミス氏は移動しませんでした!):
Teacher | Date | Room
---------|------------------| ----
Mr Smith | 2019-03-19 18:15 | A12
結論は何ですか? (1)1NFの非公式だが正しい定式化。 (2)から、「非素数属性」がないことがわかります。2NFと3NFは無料で提供されます。
私の日記は3NFです。良い!いいえ。DBスキーマでこれを受け入れるデータモデラーがないため、実際にはそうではありません。 Room
属性はTeacher
属性に依存しています(繰り返しますが、教師は移動しません!)が、スキーマはこの事実を反映していません。正気なデータモデラーは何をしますか?テーブルを2つに分割します。
Teacher | Date
----------|-----------------
Mr Smith | 2018-12-18 18:15
Mr Jones | 2018-12-18 18:30
Ms Doe | 2018-12-18 18:45
Ms Rogers | 2018-12-18 19:00
そして
Teacher | Room
----------|-----
Mr Smith | A12
Mr Jones | B10
Ms Doe | C21
Ms Rogers | A08
ただし、3NFは主な属性の依存関係を処理しません。 これは問題です:3NF準拠では、を確保するのに十分ではありません状況によってはサウンドテーブルスキーマの設計です。
BCNFでは、属性が2NFおよび3NFルールの主要な属性であるかどうかは関係ありません。自明でない依存関係(サブセットは明らかにスーパーセットによって決定されます)ごとに、行列式は完全なスーパーキーです。 つまり、完全なスーパーキー(些細なFDを除く)以外の何かによって決定されるものはありません。 (正式な定義については他の回答をご覧ください)。
Room
がTeacher
に依存するとすぐに、Room
はTeacher
のサブセットでなければなりません(そうではありません)。またはTeacher
はスーパーキーでなければなりません(それは私の日記ではそうではありませんが、テーブルを分割するときはそうです)。
要約すると、BNCFはより厳密ですが、私の意見では、3NFよりも把握しやすいと考えています。