sql >> データベース >  >> RDS >> Mysql

正規化プロセス中に非正規化テーブルを作成するためのプラクティス/ガイドラインは存在しますか?

    TL; DR 特定の通常の形式に分解するには、公開されているアルゴリズムに従う必要があります。

    PS新しい列を導入したため、正規化によって元のCDからArtistを取得しませんでした。しかし、テーブルArtistが明白な意味を持っていると仮定します。なぜ「私が理解している限り、これも第3正規形ではない」と思いますか。元のCDでartist->yearの場合、Artistでも同様です。ただし、{artist}は{artist_id}とともにArtistのCK(候補キー)であり、Artistは3NF(および5NF)にあります。

    質問の元のバージョンと現在のバージョンから、列cd_id、title、group、yearを持ち、cd cd_idのタプルを保持するベーステーブルCDが提案されています。 タイトルタイトル グループグループによって作成されました 年に形成されたもの 。列cd_idは一意であるため、CKです。 FD{group}->年も開催されます。

    正規化では、新しい列名は導入されません。提案されたベーステーブルを、それぞれがその列のより小さなサブセットを持つ他のテーブルに置き換えます。これらのテーブルは、常にその値に結合します。 BCNFまでの正規化は、FD(機能依存性)に基づいています。FDは、ベーステーブルのCKを決定するものでもあります。したがって、質問には分解が含まれていません。特定のプロパティがある場合とない場合がある、質問を連想させる可能性のある分解は、列セット{cd_id、title、group}および{group、year}を持つテーブルです。

    他のFDはオリジナルを保持します。列が何であるかのために保持するものもあります。 CKのために保持するものもあります。 {group}->年が成立するため、一部は成立します。一般に、3つすべてが保持するため、特定の1つが保持されます。そして、おそらく他の人は、どのタプルが関係に入ると想定されているのか、そしてどのような状況が発生する可能性があるのか​​を考えています。 すべてを決める必要があります FDが成立するかどうか。

    もちろん、あなたは言われたかもしれません 保持するのは、そのような状況で保持しなければならないものだけです。しかし、あなたはしません があるため、保持されるFDは{group}->年のみであると言われています。 些細なFDとCKのすべてのスーパーセットが列のすべてのセットを機能的に決定します

    3NFの定義の1つは、関係が2NFにあり、非プライム列がCKに一時的に機能的に依存していないことです。 (各条件には他の定義が含まれていることに注意してください。)これを使用して、関係が3NFにあるかどうかを確認する場合は、次に、すべてを確認する必要があります。 CKはそうです。適切なアルゴリズムを使用してこれを最速で行うことができますが、どの列のセットがすべての列を機能的に決定するかを確認できますが、それらはCKであるため、そのような小さいセットは含まれていません。次に、定義の2つの条件を確認します。

    3NFに正規化する場合は、3NFに分解するためのアルゴリズムに従う必要があります。あなたはあなたが従うべきだと思うプロセスを説明しません。ただし、実績のあるアルゴリズムに従わない場合は、選択したコンポーネントが常に元のコンポーネントに結合する場合と結合しない場合があり、それぞれが特定のより高い通常の形式である場合とそうでない場合があります。 分解の例に注意してください あなたが見たのは分解アルゴリズムの提示ではありません 。

    NF(通常の形式)の定義は、関係がそのNFに存在するために満たさなければならない条件を示します。それらは、より高いNFの関係に非損失分解(可能な場合はFDを保持)する方法を教えてくれません。人々は、特定のNFへの分解を生成するためのアルゴリズムを考案しました。 (そして、特定のNFに分解することは、一般に、最初に低いNFに分解することを含みません。低いNFを通過すると、実際には、高いNFごとに分解するときに、元の良い高いNFの分解が生成されるのを防ぐことができます。)

    また、一部のFDが保持されている場合、他の特定のFDが保持されなければならないことに気付かない場合があります。後者は、前者からのアームストロングの公理を介して決定することができます。したがって、特定のNFに違反する存在である特定のFDを取り除くために分解したからといって、それを侵害した他のFDが処理されなかったということにはなりません。それらは新しいコンポーネントに存在する可能性があります。または、問題のある方法で存在することができないため、可能な場合にそれらを「保存」しておらず、設計が不十分になる可能性があります。

    大学/大学の教科書/コース/プレゼンテーションで、特定のNFアルゴリズム、さらに言えばNFと正規化自体について学びます。多くはオンラインです。




    1. PostgreSQLで月ごとの成長を計算する方法

    2. MySQLテーブルでNULLを使用する場合

    3. SQLで年ごとにグループ化する方法

    4. CakePHPの注文が機能しない