私は1NFを把握しようとしていますが、この次の表が1NFであるかどうか疑問に思っています。列で first_name、last_name、および full_name を繰り返すことができるため、列 user_id と first_name、last_name、および full_name がある新しいテーブルにシフトする必要があるため、ノーと仮定します。以下の図は、参考のデータベースのスクリーンショットです。
2 に答える
1NF は原子性に関するものであり、冗長性に関するものではありません (それが高次正規形に関するものです)。基本的に、すべての属性がアトミックである場合、テーブルは 1NF になります。
明らかに、テーブルが 1NF にあるかどうかは、「アトミック」と定義するものによって異なります。「原子性」が実際に何を意味するかについては、いくつかの論争の問題がありますが、ここでは実用的なケースバイケースのアプローチを採用し、単純に次のように尋ねます。
私が解決しようとしている問題のコンテキストでは、値の任意の部分にアクセスすることは理にかなっていますか、それとも常に値全体にアクセスしますか?
常に全体にアクセスする場合、その特定のコンテキストではアトミックです。
あなたの例では、first_name
and にlast_name
個別にアクセスする可能性が高いため、full_name
非アトミックであり、それが 1NF に違反する理由になります。ただし、姓と名に個別にアクセスする必要がないことがわかっている場合は、だけfull_name
を使用しても 1NF に違反することはありません。
1値に「アクセスする」ことは、ここではかなり広く理解されるべきです。明らかにデータベースから読み取ることを意味するかもしれませんが、制約で使用したり、インデックスを作成したりすることも意味する可能性があります...
確かにそうかもしれません。
現在の設計であなたが言っていることは、それが最初の正常である場合、単一の「エンティティ」(単にそれを人と呼びましょう) が 1 つのユーザー レコードに関連付けられているということです。
名前フィールドを別のテーブルに移動する場合、基本的には、1 人の「人」を 1 つまたは複数のユーザー レコードに関連付けることができ、その人は名前を更新するときにすべてに同じ変更を加える必要があるということです。彼らの「ユーザー」の
このような構造が必要な場合、テーブルは次のようになります。
user_id|username|password|email|person_id
そして、「人」ごとに個別のテーブルがあります
person_id|first_name|last_name|full_name
最初の通常は、データの複製に関するものではありません。名前だけを見れば、「Bob」や「Alice」という名前の人がたくさんいる可能性があります。そのデータが何度も重複しているからといって、テーブルに重複データがあると言っているのと同じではありません。ポイントは、各レコードがアトミックであることです。