Потенциальный ключ или просто ключ реляционной базы данных — это любой набор столбцов , которые имеют уникальную комбинацию значений в каждой строке, с дополнительным ограничением, заключающимся в том, что удаление любого столбца может привести к появлению дублирующихся комбинаций значений.
Кандидатный ключ — это минимальный суперключ , [1] т. е. суперключ, который не содержит меньший. Поэтому отношение может иметь несколько потенциальных ключей, каждый с разным количеством атрибутов. [2]
Конкретные потенциальные ключи иногда называются первичными ключами , вторичными ключами или альтернативными ключами . Столбцы в потенциальном ключе называются основными атрибутами , [3] а столбец, который не встречается ни в одном потенциальном ключе, называется неосновным атрибутом .
Каждое отношение без значений NULL будет иметь по крайней мере один потенциальный ключ: поскольку не может быть повторяющихся строк, набор всех столбцов является суперключом, и если он не является минимальным, то некоторое его подмножество будет минимальным.
Существует функциональная зависимость между потенциальным ключом и всеми атрибутами в отношении.
Суперключи отношения — это все возможные способы, которыми мы можем идентифицировать строку. Кандидатные ключи — это минимальные подмножества каждого суперключа, и как таковые они являются важной концепцией для проектирования схемы базы данных .
Определение потенциальных ключей можно проиллюстрировать следующим (абстрактным) примером. Рассмотрим переменную отношения ( relvar ) R с атрибутами ( A , B , C , D ), которая имеет только два следующих допустимых значения r1 и r2 :
Здесь r2 отличается от r1 только значениями A и D последнего кортежа.
Для r1 следующие наборы обладают свойством уникальности, т.е. в экземпляре нет двух различных кортежей с одинаковыми значениями атрибутов в наборе:
Для r2 свойство уникальности выполняется для следующих множеств;
Поскольку суперключи relvar — это наборы атрибутов, обладающие свойством уникальности для всех допустимых значений этой relvar, и поскольку мы предполагаем, что r1 и r2 — это все допустимые значения, которые может принимать R , мы можем определить набор суперключей R , взяв пересечение двух списков:
Наконец, нам нужно выбрать те наборы, для которых в списке нет соответствующего подмножества , в данном случае это:
Это действительно потенциальные ключи relvar R.
Мы должны рассмотреть все отношения, которые могут быть назначены relvar, чтобы определить, является ли определенный набор атрибутов потенциальным ключом. Например, если бы мы рассматривали только r1 , то мы бы пришли к выводу, что {A,B} является потенциальным ключом, что неверно. Однако из такого отношения мы могли бы сделать вывод, что определенный набор не является потенциальным ключом , поскольку этот набор не обладает свойством уникальности (пример {A,D} для r1 ). Обратите внимание, что существование надлежащего подмножества набора, обладающего свойством уникальности, в общем случае не может использоваться в качестве доказательства того, что надмножество не является потенциальным ключом. В частности, обратите внимание, что в случае пустого отношения каждое подмножество заголовка обладает свойством уникальности, включая пустой набор.
Набор всех потенциальных ключей может быть вычислен, например, из набора функциональных зависимостей . Для этого нам нужно определить замыкание атрибута для набора атрибутов . Набор содержит все атрибуты, которые функционально подразумеваются .
Найти один ключ-кандидат довольно просто. Мы начинаем с набора атрибутов и пытаемся последовательно удалить каждый атрибут. Если после удаления атрибута замыкание атрибута остается прежним, то этот атрибут не нужен, и мы можем удалить его навсегда. Мы называем результат . Если — набор всех атрибутов, то — ключ-кандидат.
На самом деле мы можем обнаружить каждый возможный ключ с помощью этой процедуры, просто пробуя каждый возможный порядок удаления атрибутов. Однако существует гораздо больше перестановок атрибутов ( ), чем подмножеств ( ). То есть, многие порядки атрибутов приведут к одному и тому же возможному ключу.
Существует фундаментальная трудность для эффективных алгоритмов вычисления потенциальных ключей: Определенные наборы функциональных зависимостей приводят к экспоненциально большому количеству потенциальных ключей. Рассмотрим функциональные зависимости , которые дают потенциальные ключи: . То есть, лучшее, на что мы можем рассчитывать, — это алгоритм, который эффективен по отношению к количеству потенциальных ключей.
Следующий алгоритм фактически выполняется за полиномиальное время по количеству потенциальных ключей и функциональных зависимостей: [4]
функция find_candidate_keys(A, F) /* A — это набор всех атрибутов, а F — это набор функциональных зависимостей */ К[0] := минимизировать(А); n := 1; /* Количество ключей, известных на данный момент */ i := 0; /* Текущий обрабатываемый ключ */ пока i < n делаем для каждого α → β ∈ F делаем /* Создать новый потенциальный ключ из предыдущего известного ключа и текущего FD */ S := α ∪ (K[i] − β); /* Поиск того, является ли новый потенциальный ключ частью уже известных ключей */ найдено := ложь; для j := 0 до n-1 сделать если K[j] ⊆ S тогда найдено := true; /* Если нет, добавьте его */ если не найдено , то K[n] := минимизировать(S); п := п + 1; я := я + 1 возврат К
Идея алгоритма заключается в том, что при наличии потенциального ключа и функциональной зависимости обратное применение функциональной зависимости дает набор , который также является ключом. Однако он может быть покрыт другими уже известными потенциально возможными ключами. (Алгоритм проверяет этот случай с помощью переменной «найденный».) Если нет, то минимизация нового ключа дает новый потенциально возможный ключ. Ключевое понимание заключается в том, что все потенциально возможны ключи таким образом.
Обратите внимание, что извлечение позволяет "отношению" иметь любое количество первичных ключей, и, более того, такие ключи могут быть "избыточными" (лучше: приводимыми ). Другими словами, то, что в статье называется первичным ключом, позже (и лучше) стало известно как суперключ , а то, что в статье называется неизбыточным (лучше: неприводимым ) первичным ключом, позже стало известно как ключ-кандидат или (лучше) просто ключ .