15

私は、厳密な数学や証明なしで、5NF を理解するために 2 つのオンライン ソースを使用しています。

  1. A Simple Guide to Five Normal Forms in Relational Database Theory (Kent 著。これは、CJ Date 自身によってレビューされ、彼の著作の 1 つで承認されているようです)
  2. 第 5 正規形(ウィキペディアの記事)

ただし、これらの参照のいずれも理解できません。

まず参考文献 #1 (Kent's) を見てみましょう。

「しかし、特定のルールが有効であると仮定してください。エージェントが特定の製品を販売し、その製品を製造している会社を代表している場合、彼はその会社のためにその製品を販売しています。

そして、元のテーブルを分割します(すべてのテーブル名は私が付けたものです)...

acp(agent, company, product)

-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Smith | GM      | truck   | 
| Jones | Ford    | car     | 
-----------------------------

... 3 つのテーブルに:

ac(agent, company)
cp(company, product)
ap(agent, product)

-------------------   ---------------------   ------------------- 
| AGENT | COMPANY |   | COMPANY | PRODUCT |   | AGENT | PRODUCT |
|-------+---------|   |---------+---------|   |-------+---------|
| Smith | Ford    |   | Ford    | car     |   | Smith | car     |
| Smith | GM      |   | Ford    | truck   |   | Smith | truck   |
| Jones | Ford    |   | GM      | car     |   | Jones | car     |
-------------------   | GM      | truck   |   -------------------
                      ---------------------

しかし、上記の規則の英語の意味を理解しているかどうかさえわかりません。上記のルールについての私の理解では、その'then'句は完全に冗長です! 為に、

エージェントが商品を販売している場合

このエージェントがその製品を製造している会社を代表している場合、

次に、明らかに、このエージェントはその会社のためにその製品を販売しています。

では、このステートメントの「ルール」はどこにあるのでしょうか? 実際、それは私には非声明のようです!

ac、cp、ap の 3 つの表から逆算してみると、実際のルールは次のように思われます。すべての製品を販売できない可能性があります。」

しかし、元のテーブル acp はすでにこのルールを取得していました。ですから、5NF の説明では、ここで何が起こっているのかわかりません。

参考文献 #2 (ウィキペディア) を見てみましょう。

ただし、次のルールが適用されるとします。「巡回セールスマンは、特定のブランドと特定の製品タイプをレパートリーに持っています。ブランド B1 とブランド B2 が彼のレパートリーにあり、製品タイプ P が彼のレパートリーにある場合、 (ブランド B1 とブランド B2 の両方が製品タイプ P であると仮定すると、巡回セールスマンは、ブランド B1 によって製造された製品タイプ P とブランド B2 によって製造された製品タイプ P の製品を提供しなければなりません。」

繰り返しになりますが、このルールの英語の意味だけに頼ってみると、

セールスマンがブランド B1 と B2 を持っていて、製品 P を持っている場合、

IF製品 P は、ブランド B1 と B2 の両方によって製造されています。

THEN、いったいなぜ彼は、この新しい ' の前でも十分に機能していた元の 3 列のテーブル 'sbp(salesman, brand, product)' と同じように、ブランド B1 と B2 の製品 P を提供できないのでしょうか?ルール」が施行された?

誰か明確にしてくれませんか?

4

3 に答える 3

28

ほら、物事を逆に理解する方がはるかに簡単です。

まずは5NF。テーブル (関係変数) は、分解しても冗長性が除去されない場合、5NF にあります。したがって、冗長性の削除に関する限り、これは最終的な NF です。

元のテーブルには明らかに冗長性があります。「スミスはフォードを代表する」と主張している。2回、「スミスはGMを代表しています」。二回。

それでは、これを 2 つ以上の射影に分解して、冗長性を減らすことができるかどうか見てみましょう。

後ろ向きに始めましょう。

  • 会社が存在します。 {COMPANY}

  • エージェントが存在します。 {AGENT}

  • 製品が存在します。 {PRODUCT}

  • 会社製品を作ります。{COMPANY, PRODUCT}

  • エージェントは会社を表します。{AGENT, COMPANY}

ここで一時停止します。「エージェントが会社を代表し、その会社が製品を製造している場合、エージェントはその製品を販売する」というルールがあるとします。

これは単に {AGENT, COMPANY} JOIN {COMPANY, PRODUCT}; しかし、これは余分なタプル、つまり(Jones, Ford, truck);を生成します。ジョーンズはトラックを販売していないため、これは正しくありません。

したがって、すべての代理店がすべての製品を販売しているわけではないため、そのことを明示する必要があります。

  • エージェントはProductを販売します。{AGENT, PRODUCT}

今参加したら

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

その余分なタプルは、への結合によって削除され{AGENT, PRODUCT}ます。

物事を直感的に把握するために、ルールを少し変更できます。

オリジナル

エージェントが特定の製品を販売し、その製品を製造している会社を代表している場合、エージェントはその製品をその会社のために販売します。

改変(同義)

エージェントが製品を販売し、エージェントが会社を代表し、会社がその製品を製造する場合、エージェントはその会社のためにその製品を販売します

説明済み(上記の箇条書きから置き換え)

もし {AGENT, PRODUCT}{AGENT, COMPANY}そして、{COMPANY, PRODUCT} そして{AGENT, COMPANY, PRODUCT}

したがって、ルールは結合の発生を許可し、したがって分解を許可します。

これを元のテーブルの述語と比較します。

エージェントは会社を代表し、会社が製造する 製品を販売します。

ルールと同じではないため、ルールに違反する異常が発生する可能性があります。Bill Karwin の例を参照してください。


編集(以下のコメントを参照)

元の table があるとしますが、ルールはありません

テーブルにいくらかの冗長性があることは明らかなので、その冗長性を何らかの方法で削除する方法があるかどうか疑問に思うかもしれません。通常の方法は、テーブルの射影に分解することです。

したがって、いじくり回した後、 に分解できることがわかりました{AGENT, PRODUCT}, {AGENT, COMPANY}, {COMPANY, PRODUCT}。あなたの例のように、現在のデータは確かにそれを可能にします。

そして、「どの代理店がどの会社のどの製品を販売しているか?」答えは単純です

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

その後、ホンダが登場し、乗用車やトラックも製造しています。問題ありません。 に挿入(Honda, truck) , (Honda, car)するだけ{COMPANY, PRODUCT}です。

次に、スミスはホンダ車を販売することに決めましたが、トラックは販売しませんでした。ごめんなさい、まさか、おっと!彼はすでに乗用車とトラックを販売しているため、ホンダを代表したい場合は、両方を販売する必要があります。

タプルがあるので

(Smith, Honda) (Honda, truck) (Smith, truck)
               (Honda, car)   (Smith, car)

というわけでルール紹介!本当にしたくありませんでした - 冗長性を取り除こうとしていただけです。

問題は、元のデータセットが単なるまぐれだったのか、それとも DB の外部で強制されたルールの結果だったのかということです。

著者(Kent)は、ルールが存在し、デザインがそれに一致しないと主張しています。確かに、元のテーブルが受け入れる(Smith, Honda, car)だけでも問題ありません。必要ではありません(Smith, Honda, truck)


理論上のポイント (つまらない場合は無視してください)

ルール

If {AGENT, PRODUCT} and {AGENT, COMPANY} and {COMPANY, PRODUCT} then {AGENT, COMPANY, PRODUCT}; (Agent, Company, Product)トリプレットごとに。

依存関係に参加することを明示的に述べています

* { {AGENT, COMPANY}, {COMPANY, PRODUCT}, {AGENT, PRODUCT} }

元のテーブルを保持します。


よく言われるように、このようなケースはまれです。実際には非常にまれであるため、教科書の例でさえ、基本的な考え方を説明するために奇妙なルールを導入する必要があります。


EDIT II(楽しい部分ですが、理解に役立つかもしれません)

ルールが存在せず、どのエージェントも自分が望むものをどの会社からでも販売できるという明確な要件があると仮定します。したがって、ルールは明らかに間違っています。

その場合、元のテーブルがあります

{AGENT, COMPANY, PRODUCT}

私は次のように主張します。

  1. オールキーでBCNFに入っています。

  2. 分解することはできません (現在のデータでは分解できるかもしれませんが、将来は分解できません)。

  3. BCNF、全鍵、分解できないので5NFです。

  4. それは 5NF にあり、オールキーであるため、6NF にあります。

したがって、テーブルが BCNF または 6NF にあるかどうかを決定するのは、ルールの存在または非存在です。つまり、同じテーブルの同じデータです。

于 2013-08-03T12:29:00.937 に答える
12

すべての正規形は、異常、つまりデータの論理的矛盾を避けるためのものです。

次の関係で表される第 5 正規形に違反すると、異常が発生する可能性があります。

-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Jones | Ford    | car     | 
| Jones | GM      | truck   | 
-----------------------------

したがって、ジョーンズが GM とフォードで働いており、ジョーンズが自動車とトラックを販売していることもわかっています。そして、GM が自動車を製造していることを (スミスから) 知っています。では、なぜ の行がないの[Jones, GM, car]でしょうか。それは異常です。ジョーンズはGM 車を売るはずですが、この表にはそれを一貫させるものは何もありません。

問題は、1 つの関係を使用して複数の独立した事実を表現しようとすることにあります。
代わりに、これらの独立した事実を独立した関係accp、およびとして表すとap、異常の可能性がなくなります。


あなたのコメントについて:

この例では、セールスマンは販売できるものは何でも売りたいと思っていると仮定します。彼があるタイプの車両を販売でき、彼が会社で働いていて、その会社がそのタイプの車両を製造している場合、セールスマンは間違いなくそれを販売します。

この前提は、William Kent の記事で述べられています。

しかし、特定のルールが有効であると仮定します。エージェントが特定の製品を販売し、その製品を製造している会社を代表している場合、彼はその会社のためにその製品を販売します。

したがって、この前提に基づいて、考えられるすべての有効な組み合わせが 3 列のテーブルの行になる必要があることは暗示的です。これは、データが満たすべきビジネス ルールです。

しかし、単一のテーブルに、その前提と一致するために必要な行が 1 つも含まれていない場合、ビジネス ルールを表すことができません。基本的に、「事実」が重複して保存される可能性が生じるためです。

ファクトを 3 つのテーブルに分割することにより、各ファクトは 1 回だけ格納されます。より単純な 3 つのテーブル間の JOIN の結果は、元の 3 列のテーブルと同様の関係を自然に生成しますが、異常がないことが保証されています。

于 2013-08-03T07:42:10.587 に答える