我有下表...
TABLE: Accounts
ID (int, PK, Identity)
AccountType (int, PK)
Username (varchar)
Password (varchar)
我已经使用ID和AccountType列创建了一个复合键,以便人们可以使用相同的用户名/密码,但帐户类型不同。
这是否意味着对于我尝试并链接到的每个外表我都必须创建两列?
我正在使用SQL Server 2008
答案 0 :(得分:8)
这是否意味着对于我尝试并链接到的每个外表我都必须创建两列?
是的,你会的。
但是,最好使用单独的表来存储用户名/密码,并将此表链接到user_accounts
(使用复合主键)。
我已经使用ID和AccountType列创建了一个复合键,以便人们可以使用相同的用户名/密码,但帐户类型不同。
对于您当前的设计,具有相同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 :(得分:4)
我已经创建了一个复合键 ID和AccountType列,以便 人们可以拥有相同的 用户名/密码但不同 AccountTypes。
你不需要那个!
将您的PK单独放在ID
列上(它是IDENTITY
- 所以它始终是唯一的)并使用它来引用子表
在(UserName, AccountType)
上放置一个UNIQUE约束(或索引) - 这样就可以防止用户拥有两个类型相同的帐户
在我看来,你的PK中AccountType
毫无意义。
请改用此设计:
TABLE: Accounts
ID INT IDENTITY PRIMARY KEY
AccountType INT UNIQUE CONSTRAINT(Username, AccountType)
Username VARCHAR UNIQUE CONSTRAINT(Username, AccountType)
Password VARCHAR
答案 2 :(得分:1)
是。为避免这种情况,我将ID设为一个int标识,并将其作为主键,然后在Username / AccountType上添加一个新的唯一索引。