Существует множество различных
видов ключей и по каждому виду дано много
определений. Наиболее полно перечень видов
ключей представлен в работе Joe Celko
[D&D], там же даны определения каждого
вида ключа. В большой цитате из этой книги,
приведённой ниже, даны определения различных
ключей:
«Первичный ключ (primary
key) – это ключ, который может быть выбран
АБД (администратором базы данных) для
представления таблицы. В оригинальной
реляционной модели Кодда таблица должна
иметь первичный ключ. Однако большинство
теоретиков реляционной модели признают
факт, что ключ есть ключ, и логически
здесь нет ничего особенного относительно
первичного ключа.
В SQL-машинах, тем не менее,
первичный ключ может обладать особенными
свойствами. Машины баз данных часто создают
предопределённые соединения в специальных
индексных структурах для первичного ключа.
Первичный ключ также по умолчанию используется
ссылочными ограничениями. Так могут быть
другие специальные индексные структуры,
которые поддерживают ограничения между
таблицами. Таблицей, на которую ссылаются,
и таблицей, которая ссылается.
Вторичный ключ (secondary
key) или ключ-кандидат (candidate
key) – комбинация столбцов, отличная от
комбинации, составляющей первичный ключ.
Эти ключи могут сопровождаться уникальными
(UNIQUE) и не пустыми (NOT NULL) ограничениями
в SQL. Существует различие в SQL между
уникальным ограничением (UNIQUE) и ограничением
первичного ключа. Ограничение первичного
ключа всегда NOT NULL у всех его столбцов,
в то время как ограничение UNIQUE позволяет
одно и только одно значение NULL в каждом
столбце, если не наложено иного ограничения.
Простой ключ (simple
key) – ключ, содержащий только один атрибут.
В идеале мы бы хотели самый короткий и
самый простой из возможных типов данных,
чтобы операции объединения (JOIN) производились
быстрее. С этой точки зрения нам больше
всего подходит тип INTEGER или другой
числовой тип данных, который имеет аппаратную
поддержку для операций над ним и сравнений.
Сложный (compound)
или составной ключ (composite
key) – ключ, состоящий более чем из одного
атрибута.
Суррогатный ключ
(surrogate key) – ключ создаваемый внутри
базы данных, который не содержит в себе
никакой информации. Суррогатный ключ часто
используют вместо значимого сложного ключа,
который является слишком громоздким, чтобы
использоваться в реальной базе данных.
Идея состоит в том, что система поддерживает
его, и он никогда не показывается пользователю.
Искусственный ключ
(artificial key) – ключ созданный внутри
базы данных или пользователем с помощью
некоторой процедуры, который не содержит
информацию сам по себе. Искусственный
ключ используется для создания идентификаторов
строк, когда сущность должна быть описана
полностью, чтобы однозначно идентифицировать
конкретный элемент.
Интеллектуальный ключ
(intelligent key) также называемый «значимый
ключ» (meaningful key) или «естественный
ключ» (natural key); ключ, в который
включены значимые атрибуты и, таким образом,
он содержит информацию.
Естественный ключ
(natural key) – это частный случай интеллектуального
ключа, который тоже является естественным
и неизменяемым в приложении. Например,
идентификация области по её физическим
координатам или человека по его ДНК или
отпечаткам пальцев. Главной его характеристикой
является то, что, по сущности, вы можете
определить значение ключа.
Майк Паккард (Mike Packard)
описал различие между интеллектуальным
и естественным ключами, отмечая, что интеллектуальный
ключ содержит перегружаемые (overloaded)
значения, в то время как естественный
ключ содержит единственное значение.
Суперключ (super
key) – сложный ключ с большим числом столбцов,
чем необходимо для того, чтобы быть уникальным
идентификатором. Это не всегда плохо,
так как избыточность может оказаться полезной
пользователю.
Перекрывающиеся ключи
(overlapping keys) – сложные ключи, которые
имеют один или более общих столбцов».
Основные баталии велись
по вопросу выбора между суррогатными и
интеллектуальными ключами. Возможно, если
бы др. Е. Кодд определил свою позицию
по данному вопросу более чётко, то споры
бы утратили остроту, но этого не произошло.
Вот как об этом пишет Крис Дейт (Chris
Date) [CD WENE] «в статье про RM/T Кодд
также впервые использует идею суррогатов
- т.е. определяемых системой идентификаторов.
(Снова эта идея подается только в связи
с предлагаемыми семантическими расширениями,
хотя нет никаких оснований, не использовать
ее в базовой модели, и в пользу этого
имеется много веских аргументов). Однако,
к сожалению, в статье утверждается, что
суррогаты должны быть скрыты от пользователей
- очевидное нарушение приведенного ранее
в этой статье определения реляционной
базы данных, в котором говорится, что
все данные в базе данных должны быть доступны
(авторизованным) пользователям. На самом
деле, можно было привести тот аргумент,
что сокрытие суррогатов нарушает собственный
Информационный Принцип Кодда, который
устанавливает, что вся информация в базе
данных должна явно представляться в терминах
отношений и никак иначе».
Обсуждению вопроса выбора
между интеллектуальными и суррогатными
ключами и посвящена данная статья. Безусловно,
выбор в пользу интеллектуального ключа
требует очень хорошего знания предметной
области. Сам интеллектуальный ключ может
состоять из набора атрибутов различных
типов в разных сочетаниях. В отличие от
этого суррогатный ключ представляет собой
некоторый универсальный атрибут, как правило,
целочисленного типа, который не зависит
ни от предметной области, ни, тем более,
от структуры отношения, которое он идентифицирует.
Эта универсальность суррогатного ключа
и позволяет называть данный атрибут не
ключом, но отмычкой.
|