-1

私は1NFを把握しようとしていますが、この次の表が1NFであるかどうか疑問に思っています。列で first_name、last_name、および full_name を繰り返すことができるため、列 user_id と first_name、last_name、および full_name がある新しいテーブルにシフトする必要があるため、ノーと仮定します。以下の図は、参考のデータベースのスクリーンショットです。

http://imgur.com/kerlB

4

2 に答える 2

4

1NF は原子性に関するものであり、冗長性に関するものではありません (それが高次正規形に関するものです)。基本的に、すべての属性がアトミックである場合、テーブルは 1NF になります。

明らかに、テーブルが 1NF にあるかどうかは、「アトミック」と定義するものによって異なります。「原子性」が実際に何を意味するかについては、いくつかの論争の問題がありますが、ここでは実用的なケースバイケースのアプローチを採用し、単純に次のように尋ねます。

私が解決しようとしている問題のコンテキストでは、値の任意の部分にアクセスすることは理にかなっています、それとも常に値全体にアクセスしますか?

常に全体にアクセスする場合、その特定のコンテキストではアトミックです。

あなたの例では、first_nameand にlast_name個別にアクセスする可能性が高いため、full_name非アトミックであり、それが 1NF に違反する理由になります。ただし、姓と名に個別にアクセスする必要がないことがわかっている場合は、だけfull_nameを使用しても 1NF に違反することはありません。


1値に「アクセスする」ことは、ここではかなり広く理解されるべきです。明らかにデータベースから読み取ることを意味するかもしれませんが、制約で使用したり、インデックスを作成したりすることも意味する可能性があります...

于 2012-09-20T00:20:10.150 に答える
1

確かにそうかもしれません。

現在の設計であなたが言っていることは、それが最初の正常である場合、単一の「エンティティ」(単にそれを人と呼びましょう) が 1 つのユーザー レコードに関連付けられているということです。

名前フィールドを別のテーブルに移動する場合、基本的には、1 人の「人」を 1 つまたは複数のユーザー レコードに関連付けることができ、その人は名前を更新するときにすべてに同じ変更を加える必要があるということです。彼らの「ユーザー」の

このような構造が必要な場合、テーブルは次のようになります。

user_id|username|password|email|person_id

そして、「人」ごとに個別のテーブルがあります

person_id|first_name|last_name|full_name

最初の通常は、データの複製に関するものではありません。名前だけを見れば、「Bob」や「Alice」という名前の人がたくさんいる可能性があります。そのデータが何度も重複しているからといって、テーブルに重複データがあると言っているのと同じではありません。ポイントは、各レコードがアトミックであることです。

于 2012-09-20T00:01:56.147 に答える