2011-09-15 162 views
-1

可能重複:
Should each and every table have a primary key?主鍵和數據庫規範化

我一直對有關數據庫規範化學校的項目。 我需要幫助的正常化有我在遇到困難沒有主鍵 表一表,訂閱一個表,它的結構是這樣的:

itemSubscribed emailAddress 
-------------- ------------ 
1    [email protected] 
1    [email protected] 
1    [email protected] 
2    [email protected] 
2    [email protected] 
3    [email protected] 

注意itemSubscribedemailAddress值可能會重複,所以都不能成爲主鍵。

這種結構將正常工作與我的代碼,我可以發送電子郵件給所有項目X的用戶時,有項X的更新,但我的老師需要一個規範化的數據庫和1NF必須有一個主鍵。

如果我爲了創建主鍵而創建了一個自動生成的主鍵,我不能繼續使用3NF,因爲它要求所有列都依賴於主鍵,所以w/c不是這種情況。

我應該創建一個自動生成的主鍵嗎?我錯過了關於3NF的一些事情嗎?

+0

嗯,你忘了定義一個問題! – home

+1

儘可能難以複製佔位符文本,最後忘記了這段時間。 – BoltClock

+0

我不能說這是一個答案,因爲它已經關閉了,當然這有點晚了,但是......看起來你所描述的是一張橋表。橋表通常不是什麼,而是一個複合主鍵。如果您將'itemSubscribed'和'emailAddress'列一起作爲主鍵,則不會有任何重複項,並且它位於3NF中。自動生成的主鍵是您想要使用橋接表完成的最後一件事,因爲它只會導致混淆和額外的工作,而實際上卻鼓勵重複。 – jmoreno

回答

0

您是否允許多次訂閱一個項目的電子郵件地址相同?如果不是,你的自然關鍵是顯而易見的:itemSubscribed和emailAddress。即使你在這種情況下選擇了人造主鍵,你也可能需要在兩列中有一個唯一的索引。

0

回答你的問題,是的,真的很難不擁有主鍵。數據庫必須能夠識別特定記錄。假設你想更新下面以粗體顯示的記錄,但不是一個斜體。如果沒有主鍵,你會如何做到這一點。

itemSubscribed EMAILADDRESS


1 [email protected]

1 [email protected]

1 [email protected]

在數據庫類,如果你有沒有主鍵的表,我會失敗,這對數據庫是至關重要的e設計。

現在我懷疑你不想居然有如圖所示,除非你有這樣的人不同的充其他列中的數據。爲什麼你真的想要兩個訂閱了相同條目的記錄和相同的電子郵件地址?最好有一個PK或唯一索引來防止這類不良數據。我懷疑你真的有兩個領域的天然關鍵,目前只有不好的數據。

1

一個表具有重複的行不表示關係。關係是一組元組。一套從來不會有相同的元素不止一次。一個包就像一個包,但可以有多個看起來完全相同的元素實例。

在你給我們的表中,我認爲itemSubscribed是一個計數,itemSubscribed等於一個具有相同emailAddress的兩行描述不同的事件。

但是,這是你的想法,而不是在數據中可見。

你會在這張桌子上遇到麻煩。特別是,無法區分錯誤的重複條目和兩個看起來相似的有效條目。