わかりました、いくつかのこと:
- php はこれとは何の関係もありません。正規化はデータのモデリングに関するものです
- 正規化は、ディスク容量を節約することではありません。これは、データを簡単に保守できるように編成することであり、これはデータの整合性を維持する方法です。
- 正規化は通常、いくつかの段階または「正規形」で記述されます。実際には、リレーショナル データベースを設計する人は、多くの場合、直観的に「正しく理解する」ことができます。ただし、通常のフォームとその特徴を知っておくとよいでしょう。それに関する多くのドキュメントがインターネット上にあり (fe http://en.wikipedia.org/wiki/Database_normalization )、自分で調査する必要がありますが、最も重要な段階は次のとおりです。
非正規化データ: この段階では、データは真の表形式 (「リレーショナル」) ではありません。表形式が実際に何を意味するかについては多くの議論があり、専門家は互いに意見を異にしています。しかし、ほとんどの人は、複数の値を持つ属性 (= 1 つの行に値としてリストを含むことができる列) がある場合、または繰り返しグループ (= 同じものを格納するための複数の列または列の複数のグループ) がある場合、データが正規化されていないことに同意します。データの種類)
複数の値を持つ列の例: person (first_name, last_name, phonenumbers)
繰り返しグループの例: person(first_name, last_name, child1_first_name, child1_birth_date, child2_first_name, child2_birth_date..., childN_first_name, childN_birth_date) ここで、person テーブルには、その人の子供を格納するためのいくつかの列ペア (child_first_name, child_birth_date) があります。
order (shipping_address, billing_address) のようなものは繰り返しグループではないことに注意してください: 請求先住所と配送先住所は似たようなデータかもしれませんが、それぞれが注文に対して独自の役割を持っており、どちらも注文の異なる側面を表しているだけです。child1 から child10 はありません - 子供には特定の役割がなく、子供のリストは可変です (事前にいくつのグループを予約する必要があるかわかりません)。
多値列と繰り返しグループのどちらの場合でも、基本的に「ネストされたテーブル」構造、つまりテーブル内のテーブルがあります。これらのいずれも発生しない場合、データは 1NF (第 1 正規形) であると言われます。
1NF は、構造特性に関するものです。つまり、データの表形式です。後続のすべての正規形は、冗長性の排除に関係しています。冗長性は、同じ情報が独立して複数回格納される場合に発生します。冗長性は悪いです: ある事実を変更したい場合、複数の場所で変更する必要があります。それらのうちの 1 つをチャンスにするのを忘れると、データに矛盾が生じます。データ自体が矛盾しています。
冗長性を排除できる多くのプロセスがあり、それぞれが 1nf から 6nf まで、より高い正規形につながります。ただし、通常、ほとんどのデータベースは 3nf (または、boyce-codd 正規形と呼ばれる BCNF と呼ばれるバージョンの lsight バリエーション) で適切に正規化されています。2nf と 3nf を検討する必要がありますが、原則は非常に単純です。
- テーブルは1nfにあります
- テーブルにはキーがあります (値が必要で、行を一意に識別する列または列の組み合わせ - つまり、キー列にその値の組み合わせを持つ行は 1 つだけ存在できます)
- 非キー列間に機能的な依存関係はありません
- 非キー列は、機能的にキーの一部に依存していません (ただし、機能的にはキー全体に完全に依存しています)。
機能依存性とは、列の値が別の列から派生できることを意味します。簡単な例:
order_item (order_id、item_number、customer_id、product_code、product_description、amount)
(order_id, item_number) がキーであるとしましょう。product_code と product description は機能的に相互に依存しています。ある特定の product_code については、常に同じ製品説明が見つかります (製品説明が product_code の関数であるかのように)。問題は次のとおりです。特定の製品コードの製品説明が変更されたとします。その製品コードのすべての注文を変更する必要があります。1 つだけを忘れると、データベースに一貫性がなくなります。
これを解決する方法は、(product_code, product_description) をキーとして (product_code) を持つ新しい製品テーブルを作成し、すべての製品フィールドを順番に格納する代わりに、製品テーブルの行への参照のみをorder_item レコード (この場合、order_item は product_code のみを保持する必要があります。これは、product テーブルの行を検索して product_description を見つけるのに十分です)
ご覧のとおり、このソリューションを使用すると、実際にスペースを節約でき (製品を注文する各 order_item にこれらすべての製品説明を保存しないことにより)、より多くのテーブルを取得できます (order_item から製品を分割します)。これは、ディスク容量を節約するためではなく、冗長性を排除してデータの保守を容易にするためです。説明を変更するには、製品テーブルの 1 つの行を変更するだけでよいためです。