Конструкция стола с требованием составного ключа - PullRequest
0 голосов
/ 30 июня 2018

Я строю базу данных для хранения клиентских конфигураций. Каждая конфигурация должна иметь уникальный идентификатор (int) и версию (int). Только пара из них должна быть уникальной, что подталкивает меня к созданию составного ключа. Однако проблема заключается в том, что идентификатор может генерироваться автоматически, в то время как версия всегда должна начинаться с 1 и увеличиваться при каждом изменении конфигурации.

Большинство постов здесь не рекомендуют ни использовать составные ключи, ни иметь составной ключ с автоинкрементом SQL. Одна из рекомендаций моих коллег - добавить отдельный идентификатор в качестве единственного первичного ключа и самостоятельно управлять назначением и уникальностью пары configID + Version в коде приложения.

Итак, в конце я вижу 3 варианта:

  1. PK (configID, версия) с ручным созданием обоих

  2. PK (configID, версия) с идентификатором конфигурации с автоматическим приращением и назначением версии вручную

  3. Автоинкремент PK (ID) с парой configID + версии, управляемой кодом.

Подскажите, пожалуйста, какой вариант лучше? Может быть что-то еще?

1 Ответ

0 голосов
/ 30 июня 2018

Вы должны выбрать третий вариант, автоматически увеличивающийся идентификатор.

Почему?

Первичный ключ служит нескольким целям. Возможно, наиболее важным является то, что он однозначно идентифицирует каждую строку в таблице для ссылок на внешний ключ. Внешний ключ из одного столбца намного проще, чем составной внешний ключ - как с точки зрения определения ключа, так и с точки зрения производительности. Два столбца обычно занимают больше места, чем 1.

Это также имеет некоторые приятные преимущества. Это позволяет вам изменить конфигурацию или версию, связанную с каждой парой. Возможно, вы не хотите делать это сейчас. Но в будущем вы можете сказать: «Черт возьми, я хотел бы легко удалить версию». Или: «Эти два клиента объединились, и я хочу собрать их конфигурации».

Может также иметь смысл автоматически увеличивать конфигурацию. Я не уверен в этом. Чтобы назначить версию, вам потребуется триггер для сохранения порядкового номера для каждого конфига.

...