2010-05-26 204 views
2

我有以下表...複合鍵作爲外鍵?

TABLE: Accounts 
    ID (int, PK, Identity) 
    AccountType (int, PK) 
    Username (varchar) 
    Password (varchar) 

我已經創建了一個組合鍵進行ID和ACCOUNTTYPE列,這樣的人可以有相同的用戶名/密碼,但不同的AccountTypes。

這是否意味着對於我嘗試鏈接到的每個外表,我將不得不創建兩列?

我使用SQL Server 2008

+2

是ID的東西,在現實世界中的意義?如果是這樣,我強烈建議在這種情況下使用自動生成的整數作爲主鍵。 – Syntactic 2010-05-26 15:59:18

回答

8

這是否意味着每個外部表,我嘗試並鏈接到我必須創建兩列?

是的,你會的。

但是,最好使用單獨的表來存儲用戶名/密碼,並將此錶鏈接到user_accounts(帶有複合主鍵)。

我已經在ID和AccountType列中創建了一個組合鍵,這樣人們可以擁有相同的用戶名/密碼,但擁有不同的AccountTypes。

與你目前的設計,人們用同樣id但不同AccountType可以有不同的用戶名和密碼。

這裏是你應該怎麼做吧:

CREATE TABLE t_user (id INT NOT NULL IDENTITY PRIMARY KEY, Username VARCHAR(100) NOT NULL, YouShouldAlwaysUseSaltedAndHashedPasswords VARCHAR(64) NOT NULL) 

CREATE TABLE t_user_account (user_id INT NOT NULL, account_id INT NOT NULL, PRIMARY KEY (user_id, account_id), FOREIGN KEY (user_id) REFERENCES t_user (user_id)) 
+1

感謝您的回答。我想我的問題更多的是一個設計問題,而不是其他任何問題,你的回答已經澄清了我所遇到的問題。 – paulio 2010-05-27 08:21:57

+0

被引用的列必須與創建密鑰的順序相同。要獲得正確的順序,請右鍵單擊外鍵(在SSMS中展開表時在keys文件夾下)和腳本創建到剪貼板。糊。確保您引用的列與您的密鑰的順序相同。 – Trevor 2013-12-27 19:28:09

1

是。爲了避免這種情況,我會使ID成爲一個int標識並將其作爲主鍵,然後在Username/AccountType上添加一個新的唯一索引。

4

我創建了一個複合鍵出 ID和ACCOUNTTYPE列,以便 人可以有相同的 用戶名/密碼,但不同的 AccountTypes。

你不需要那個!

  • 把你的PK上單獨ID列(這是一個IDENTITY - 所以它總是唯一的),並用它來引用從子表

  • 放一個UNIQUE約束(或指數)的(UserName, AccountType) - 即這樣,可以防止用戶從有兩個賬戶進行同類型

有真的在你的PK AccountType,在我看來沒有任何意義。

使用此設計來代替:

TABLE: Accounts 
    ID     INT IDENTITY  PRIMARY KEY 
    AccountType  INT   UNIQUE CONSTRAINT(Username, AccountType) 
    Username   VARCHAR  UNIQUE CONSTRAINT(Username, AccountType) 
    Password   VARCHAR 
+0

這將允許具有相同用戶名的人爲不同的帳戶類型使用不同的密碼。不確定這是@op想要的。 – Quassnoi 2010-05-26 16:13:01

+0

好的答案,但是Quassnoi說的。 – paulio 2010-05-27 08:22:46

+0

@ Quassnoi,@ paulio:好的,針對不同賬戶類型使用不同的密碼可能不是一個壞主意;作爲「常規」用戶,我使用「opensesame」,而作爲「管理員」,我使用更強大的..... – 2010-05-27 09:14:22