复合键为外键?

时间:2010-05-26 15:56:40

标签: sql-server sql-server-2008

我有下表...

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

我已经使用ID和AccountType列创建了一个复合键,以便人们可以使用相同的用户名/密码,但帐户类型不同。

这是否意味着对于我尝试并链接到的每个外表我都必须创建两列?

我正在使用SQL Server 2008

3 个答案:

答案 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上添加一个新的唯一索引。