Составные ключи как внешний ключ? - PullRequest
2 голосов
/ 26 мая 2010

У меня есть следующая таблица ...

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

Я создал составной ключ из столбцов ID и AccountType, чтобы люди могли иметь одно и то же имя пользователя / пароль, но разные учетные записи.

Означает ли это, что для каждой внешней таблицы, на которую я пытаюсь сослаться, мне нужно создать два столбца?

Я использую SQL Server 2008

Ответы [ 3 ]

8 голосов
/ 26 мая 2010

Означает ли это, что для каждой внешней таблицы, на которую я пытаюсь сослаться, мне нужно создать два столбца?

Да, вы будете.

Однако будет лучше использовать отдельную таблицу для хранения имени пользователя / пароля и связать эту таблицу с 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))
4 голосов
/ 26 мая 2010

Я создал составной ключ из Столбцы ID и AccountType, чтобы люди могут иметь то же самое имя пользователя / пароль, но разные AccountTypes.

Тебе это не нужно!

  • поместите свой PK только в столбец ID (это IDENTITY - поэтому он всегда уникален) и используйте его для ссылки из дочерних таблиц

  • наложить * УНИКАЛЬНОЕ ограничение (или индекс) на (UserName, AccountType) - таким образом вы запретите пользователю иметь две учетные записи одного типа

На самом деле, нет смысла иметь AccountType в вашем ПК, по моему мнению.

Используйте этот дизайн вместо:

TABLE: Accounts
  ID                 INT IDENTITY     PRIMARY KEY
  AccountType        INT          UNIQUE CONSTRAINT(Username, AccountType)
  Username           VARCHAR      UNIQUE CONSTRAINT(Username, AccountType)
  Password           VARCHAR
1 голос
/ 26 мая 2010

Да. Чтобы избежать этого, я бы сделал ID идентификатором int и выделил его первичным ключом, а затем добавил новый уникальный индекс для Username / AccountType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...