2012-09-19 104 views
0

我想抓住1NF,我想知道下面的表是1NF還是不是。我將假定no,因爲在列中,first_name,last_name和full_name可以重複,因此需要轉移到具有列user_id和first_name,last_name和full_name的新表。下面的圖片是參考數據庫的屏幕截圖。第一範式和名字和姓氏

+0

它可能是1NF,但它也可能不適用(取決於數據)。所有的xxxx_name字段都不能爲空,有些文化可能不具有* firstname/lastname。另外:路德維希·範·貝多芬要填寫什麼? – wildplasser

+0

這是我最近碰到的東西。感謝您的提醒。 – jason328

+0

這取決於你想要走多深。名稱實際上是名稱組件的組合,可隨時間變化。有些人只有名字,一些只有姓氏,一些人改變了他們的名字。 –

回答

1

它當然可以。

如果第一個標準是正常的話,那麼你現在的設計說的是一個單一的「實體」(讓我們稱它爲一個人)與一個且只有一個用戶記錄相關聯。

如果您將名稱字段移動到單獨的表中,您基本上說的是,一個「人」可能與一個或多個用戶記錄相關聯,並且該人在更新其姓名時應該使同樣改變所有的「用戶」的

如果你需要這樣的結構,表看起來更像:

user_id|username|password|email|person_id 

,你將有一個單獨的表中的每個「人」

person_id|first_name|last_name|full_name 

第一個正常不是複製數據。只要查看名字,很可能會有許多名爲「Bob」或「Alice」的人只是因爲數據一遍又一遍地重複出現,與說表格有重複數據不一樣。重點是每個記錄應該是原子的。

+0

太棒了,謝謝!表格的建議將幫助我理解它。 – jason328

3

1NF是關於原子性,而不是冗餘(這是更高的正常形式是關於)。實質上,如果所有屬性都是原子的,那麼表格就是1NF。

顯然,表是否在1NF取決於你定義爲「原子」。什麼「原子」,其實就是一個有些爭議的問題,但我在這裏採取務實的案件逐案的做法,並簡單地問:

在我試圖解決這個問題的背景下,它是否有意義訪問價值的任何部分,或者我總是訪問整個值?

如果我總是訪問整體,那在特定的上下文中是原子的。

在你的例子中,很可能你想單獨訪問first_namelast_name,所以full_name可能是非原子的,這就是違反1NF的原因。但是,如果你知道你永遠不需要分別訪問姓氏和名字,那麼你可以有只是full_name,仍然沒有違反1NF。


「訪問」 的值應該相當廣泛理解這裏。它可能顯然意味着從數據庫中讀取它,但也可能意味着在約束中使用它,或索引它等等。