SO=で同様の質問をしました。ここで質問のタイプを尋ねることをお勧めしました。これはリレーショナルデータベースのコース用です。問題の例は、「リレーショナルデータベースのすべてのテーブルがどうして最初の正規形である」という私の最初の問題は3NFの方が良いとは考えられていないので、ステートメントは間違っていませんか?これに関する私の2番目の問題はSO 1)すべての値がアトミックである2)主キーがある-どちらも冗長性を排除しないため、これはどのように行うのかわかりません。
それを尋ねる別の方法は、なぜ値が原子的であることが重要であるのかです。
最初の正規形の最も重要なことは、冗長性を排除することではなく、繰り返しグループを排除することです。
同じ種類のデータの複数の列をレコードに持つのではなく(0NF)、繰り返された情報を個別の関係に削除し、それらを行として表します。これが1NFを構成するものです。
phone_1
、phone_2
、phone_3
のような列を含むテーブル、または212-555-1212, 212-555-1234, 416-967-1111
のようなリスト指向のデータを含むテーブルは、1NFに違反しています。
1NFは0NFよりもはるかに柔軟性があり、データの挿入、更新、読み取り時に非常に使いやすいため、重要です。これは、すべてのタイプのデータ要素(顧客の電話番号など)には、それを検索するための列が1つだけあり、その列には各レコードのデータが1つしかないためです。つまり、区切り文字列を解析したり、where phone_1=@Number or phone_2=@Number or phone_3=@Number
などの構造を使用したりすることなく、単純なSQLステートメントを使用して個々のデータ要素を読み書きできます。
1NFと3NFについて、通常の形式は累積的です。 3NFのテーブルは1NFにもあるため、「リレーショナルデータベースのすべてのテーブルは1NFにあるべきだ」と言うのは、「リレーショナルデータベース内のすべてのテーブルが3NFでなければならない」というのと同じです。私はこれらの両方が真実であると言いますが、「非正規化する本当によく考えられた理由がない限り」を追加します。
「私がそれを尋ねる別の方法はなぜ価値が原子的であることが重要であるかだと思いますか?」
私は現在、varchar/textフィールドにコンマ区切りの値を持つアプリケーションを使用していますが、これはお尻の痛みです。とりわけ、アプリケーションでは、正しい形式でデータを取得するために、愚かな文字列の分割と変換をすべて行う必要があり、DB側では、すべての検索をオンにする必要があるため、フィールドでインデックスを使用できません。 WHERE mycolumn LIKE '%search%'というフォーム
他にも理由はありますが、その2つが最初に思い浮かびます。
1NFは冗長性を排除し、データの一貫性の問題を軽減または排除するのにも役立ちます。
Invoices
のテーブルがあるとします。このテーブルには、支払いデータと顧客データが含まれています。
顧客データは、Name
、Address
、PhoneNumber
などの情報です。すべての行でこのデータを複製すると...
Invoice
のすべてのCustomer
レコードに同じ詳細があるため、データはおそらく冗長ですAddress
に対して2つの異なるCustomer
値がある場合、どちらが正しいですか?Address
テーブルで現在のアドレスを確認するよりも、Invoice
テーブルを確認する方が理にかなっています。