Есть ли какая-либо причина использовать и первичный ключ, и уникальный ключ вместе в одном поле? - PullRequest
9 голосов
/ 29 августа 2011

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

Если у меня все равно есть первичный ключ, есть ли веская причина для создания дополнительного уникального ключа в том же поле?

Ответы [ 5 ]

4 голосов
/ 29 августа 2011

Для таблицы, разрешающей многие ко многим, было бы обычно иметь ключ из двух частей (как указано в Quassnoi). Также вполне вероятно, что нужны индексы, поддерживающие доступ через любого из родителей.

Если у вас есть, например, таблицы PERSON, ADDRESS и PERSON_ADDRESS, ваша таблица PERSON_ADDRESS может иметь первичный ключ (PERSON_ID, ADDRESS_ID) и вспомогательный индекс. У вас также будет другой индекс (ADDRESS_ID, PERSON_ID), и вы, вероятно, сделаете его УНИКАЛЬНЫМ индексом (так как это уникальная комбинация полей).

Также возможно, что у вашего администратора базы данных есть какой-то особый способ генерации таблиц, который начинается с индекса UNIQUE для полей первичного ключа, за которым следует создание ограничения PRIMARY KEY. Это может отображаться в некоторых инструментах с графическим интерфейсом так, как вы предлагаете.

1 голос
/ 29 августа 2011

Просто немного теоретического фона ... При моделировании таблицы вы определяете набор ключей .Эти ключи логически эквивалентны, но для практических целей вы выбираете один из них и называете его «основным», а остальные становятся «альтернативными».

( В DDL SQL первичный ключ называется«ПЕРВИЧНЫЙ КЛЮЧ», в то время как «альтернативный ключ» называется «УНИКАЛЬНОЕ ограничение». )

Итак, в свете этого ваш вопрос эквивалентен: «Есть ли веская причина иметь два одинаковыхkeys ", и ответ таков: " no ".

При этом вы можете иметь перекрывающиеся ключи (то есть ключи, которые разделяют некоторые поля, но не все), но это, как правило, признак плохого дизайна ... и ответ: "вероятно, нет" .


OTOH, если с помощью "уникального ключа" вы на самом делеозначает "уникальный индекс ", тогда да, вам нужны оба.

Индекс не является логическим ограничением - он просто позволяет логическим ограничениям, таким как PRIMARY KEY, работать хорошо (и для запросов, но это другая тема).

1 голос
/ 29 августа 2011

Я считаю, что это невозможно (PK и ограничение уникальности для одного столбца [с]) ...

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

(из здесь , раздел " Ограничения на ограничения первичного ключа "). Не так ли?

1 голос
/ 29 августа 2011

Oracle не позволит вам создать несколько ограничений UNIQUE и PRIMARY KEY для одного и того же набора полей в одном и том же порядке и завершится ошибкой с ORA-02261.

Если у вас есть составные ключи, вы можете создать PRIMARY KEY для столбца, установленного в одном порядке (PRIMARY KEY (a, b)), и уникального ограничения для другого (UNIQUE (b, a)).

Это будет анализировать и выполнять, однако для защиты обоих ограничений будет использоваться один индекс, поэтому нет смысла.

Не могли бы вы опубликовать сценарии таблицы?

1 голос
/ 29 августа 2011

Нет, нет никаких оснований считать его уникальным;Когда вы устанавливаете столбец в качестве PK, вы уверены, что:

  1. Для этого столбца не будет принято значение NULL для INSERT или UPDATE;
  2. Значения во всей таблице для этого столбца всегдаUNIQUE;

, поэтому достаточно просто PK.Поскольку для столбца PK существует индекс UNIQUE, по определению нет необходимости добавлять какой-либо другой индекс для этого столбца только потому, что запросы будут использовать индекс PK, когда затрагивается только этот столбец.

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