データベースは初めてなので、簡単な質問に腹を立てることはありません。私のグーグルで収集した知識の正規化は、データの冗長性を減らし、パフォーマンスを向上させる限りです。しかし、実際には、マスターテーブルを他の小さなテーブルに分割し、それらの間の関係を適用し、すべての可能なユニオン、サブクエリ、結合などを使用してデータを取得する正確な理由を理解していませんでした。単一のテーブルを作成し、必要に応じてそれらを取得します。私は少し混乱しています。
5 に答える
主な理由は、データの繰り返しを排除することです。たとえば、複数のアドレスを持つユーザーがいて、この情報を1つのテーブルに保存した場合、ユーザー情報は各アドレスエントリとともに複製されます。正規化では、アドレスを独自のテーブルに分離し、キーを使用して2つをリンクします。このようにすると、ユーザーデータを複製する必要がなくなり、データベース構造が少しすっきりします。
完全な正規化では、通常、パフォーマンスは向上しません。実際、パフォーマンスが悪化することがよくありますが、データの重複はありません。実際、一部の特殊なケースでは、パフォーマンスを向上させるために、特定のデータを非正規化しました。
正規化は、「正常」であるという数学的概念に由来します。別の言葉は「垂直」です。通常の2軸座標系を想像してみてください。上に移動するとy座標が変更され、横に移動するとx座標が変更されます。したがって、すべての動きを横向きと上下の動きに分けることができます。これら2つは互いに独立しています。
データベースでの正規化は、基本的に同じことを意味します。データの一部を変更すると、データベース内の1つの情報のみが変更されることになります。電子メールのデータベースを想像してみてください。IDと受信者の名前をMailsテーブルに保存しているが、Usersテーブルもその名前をIDに関連付けている場合、つまり、ユーザー名を変更した場合は、ユーザーテーブルだけでなく、このユーザーが関与するすべてのメッセージでも変更する必要があります。したがって、軸「メッセージ」と軸「ユーザー」は「垂直」または「通常」ではありません。
一方、MailsテーブルにユーザーIDしかない場合、ユーザー名の変更はすべてのメッセージに自動的に適用されます。これは、メッセージの取得時に、すべてのユーザー情報がUsersテーブルから収集されるためです(加入)。
データベースの正規化は、最も単純な方法で、データの冗長性を最小限に抑える方法です。これを実現するために、特定の形式の正規化が存在します。
第一正規形は次のように要約できます。
- 単一のテーブルに繰り返しグループはありません。
- 関連情報のための別々の表。
- 主キーに関連するテーブル内のすべてのアイテム。
2番目の正規形では、別の制限が追加されます。基本的に、候補キーの一部ではないすべての列は、すべての候補キーに依存する必要があります(候補キーは、テーブルで複製できない最小の列セットとして定義されます)。
そして、第3正規形はもう少し進んでおり、候補キーの一部ではないすべての列が他の非候補キー列に依存してはなりません。つまり、候補キーにのみ依存することができます。これは、3NFがキー、キー全体、およびキー以外の何物にも依存しないということになるので、Codd1を助けてください。
上記の説明はデータベース理論家ではなく質問に合わせて調整されているため、説明は必然的に簡略化されます(「要約」や「基本的に」などのフレーズを使用しました)。
データベース理論の分野は複雑であり、それを本当に理解したいのであれば、最終的にはその背後にある科学にたどり着く必要があります。しかし、あなたの質問に関しては、うまくいけばこれで十分でしょう。
正規化は、冗長なデータがないことを確認するための貴重なツールです(2つの冗長な領域が同期しなくなった場合、これは実際の問題になります)。通常、パフォーマンスは向上しません。
実際、すべてのデータベースは3NFで開始する必要がありますが、潜在的な問題を認識して軽減する場合は、パフォーマンスを向上させるために2NFに下げることが許容される場合があります。
また、(明らかに)4番目、5番目、6番目などの「より高い」レベルの正規化もあることに注意してください。また、Boyce-Coddや、頭のてっぺんから思い出せないその他のレベルもあります。ほとんどの場合、3NFで十分です。
1エドガー・コッド(またはクリストファー・デイト)が誰であるかわからない場合は、おそらくそれらを調査する必要があります。彼らはリレーショナルデータベース理論の父です。
正規化を使用して、データの挿入、削除、更新の結果として発生する可能性のある異常の可能性を減らします。正規化は必ずしもパフォーマンスを向上させるわけではありません。
インターネットにはたくさんの資料があるので、ここでもう一度繰り返すことはしません。ただし、正規化ルールの 異常 (その他も)を確認できます。
上記のすべてと同様に、それは特定の意味があります。ユーザーがいて、そのユーザーが持っている車の種類を記録したいとします。
それをすべて1つのテーブルに入れれば、誰かが2台の車を所有するまで、大丈夫です...次に、その人のために2つの行が必要になり、これら2つの行をリンクできるようにする方法が必要になります。 。
そして、犬の数も記録したい場合はどうすればよいでしょうか。紛らわしい重複がたくさんある同じテーブル?一意のユーザーを管理するための独自のカスタムロジックを備えた別のテーブル?
正規化により、これらの問題の多くからあなたを遠ざけることができます...