2012-06-23 29 views
0

比方說,我有一個名爲Users的表格,它代表了網站的註冊用戶。我還有一個AccountActivation表,它將隨機生成的字符串存儲到新用戶的電子郵件中,以驗證該電子郵件。如果兩個表具有「一對一」關係,它們是否應該與主鍵具有相同的列?

AccountActivation表具有UserId列,該列也恰好是Users表的主鍵。它還有ActivationCode列來存儲代碼。任一列都可以唯一標識AccountActivation表中的一行。

所以,如果我選擇激活碼列作爲主鍵,我最終會得到兩個具有不同主鍵的一對一表。我認爲在一對一的關係中,這兩個表必須有相同的主鍵?

+2

如果你選擇'ActivationCode'作爲PK,那麼*爲什麼*你有兩個*一對一的關係?唯一的關係就是'AccountActivation.UserId - > Users.UserId' - 或者你認爲你突然有什麼? 'Users'在'UserId'上有PK,'AccountActivation'在'ActivationCode'上有PK - 完全沒有問題,沒有理由不這樣做。 –

+0

最有可能的是,「UserId」和「ActivationCode」都是AccountActivation表的候選鍵。 – wildplasser

+0

你怎麼知道同一個隨機生成的字符串不會生成一次以上,並且實際上是否需要你的應用程序執行此操作? –

回答

1

如果選擇ActivationCode作爲PK的話,爲什麼你有兩個一到一個關係?

這是有

AccountActivation.UserId -> Users.UserId 

或者你覺得還有什麼你突然有唯一的關係?

如果去做你的建議,那麼該表Users擁有對PK和UserIdAccountActivation有它的ActivationCode PK - 不是在所有問題,而且也沒有理由不去做這樣。

的列(UserIdActivationCode),你挑選的AccountActivation的PK並不重要 - 這並不影響/打擾AccountActivationUser之間的關係FK,也不會增加額外的一比一的關係任何種類的.....

如果你選擇ActivationCodeAccountActivation的PK,我拿到的唯一額外的步驟是在UserId創建一個非聚集索引,使得連接這兩個表的查詢將從中受益最大性能。

1

如果只有一個ActivationCode,他們可以共享UserId。但是這意味着當用戶重新生成密鑰時,您應該更新舊行或將其刪除。

但是爲什麼你需要存儲這樣的數據?您還可以將帳戶激活碼與某種計算和加密功能合成爲User中的唯一數據。

只是爲了說明我的建議:

Users table has two columns UserId CreationDate 

那麼令牌可能是UserId + CreationDate(例子)。您將能夠生成並檢查數據庫中的額外數據。我知道這可能不符合你的要求。

1

使AccountActivation中的UserId列成爲Users表的外鍵。

Users 
===== 

UserId primary key 
Name 
Address 
etc... 

AccountActivation 
================= 

UserId primary key (foreign key to Users.UserId) 
ActivationCode (unique constraint) 

現在你有一個一對一的關係

+0

或者在'AccountActivation'中''主鍵'可以在'ActivationCode'上並且'UserId'上的唯一約束。 –

+0

@MartinSmith - 只要UserId是唯一的,它將保持一對一的關係,否則它將變成一對多關係。 –

+0

這是什麼迴應?我沒有建議不要讓'UserId'獨一無二。如果這是迴應我對你刪除的評論的迴應,我指出'UserId,ActivationCode'上的聚集索引不起作用,因爲你不能在部分密鑰上強制實現唯一性。 –

1

你不必有相同的列2個表的主鍵有一個一對一的關係。
您可以在AccountActivation表中擁有任何列作爲主鍵。

UserId這是AccountActivation表的外鍵是Users表中的主鍵。因此,無論它是否是該表的主鍵(但它應該是唯一的,我希望它),您應該能夠使用此列唯一標識AccountActivation表中的用戶激活碼。

相關問題