Суррогатный ключ - Surrogate key

А суррогатный ключ (или же синтетический ключ, псевдоключ, идентификатор объекта, сгенерированный системой ключ, порядковый номер базы данных, не имеющий фактов ключ, технический ключ, или же произвольный уникальный идентификатор) в база данных является уникальным идентификатором либо юридическое лицо в смоделированном мире или объект в базе данных. Суррогатный ключ нет полученные из данных приложения, в отличие от естественный (или же бизнес) ключ который получен из данных приложения.[1]

Определение

Есть как минимум два определения суррогата:

Суррогат (1) - Холл, Олетт и Тодд (1976)
Суррогат представляет собой юридическое лицо во внешнем мире. Суррогат создается внутри системы, но, тем не менее, виден пользователю или приложению.[2]
Суррогат (2) - Виринга и Де Йонге (1991)
Суррогат представляет собой объект в самой базе данных. Суррогат создается внутри системы и невидим для пользователя или приложения.

В Суррогат (1) определение относится к модель данных а не модель хранения и используется в этой статье. См. Date (1998).

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

Хотя Холл и другие. (1976) об этом ничего не говорят, другие[уточнить ] утверждали, что суррогатная мать должна обладать следующими характеристиками:

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

Суррогаты на практике

В текущая база данных, суррогатный ключ может быть первичный ключ, порожденный система управления базами данных и нет полученные из любых данных приложения в базе данных. Единственное значение суррогатного ключа - действовать как первичный ключ. Также возможно, что суррогатный ключ существует в дополнение к сгенерированному базой данных UUID (например, номер HR для каждого сотрудника, кроме UUID каждого сотрудника).

Суррогатный ключ часто представляет собой последовательный номер (например, Sybase или SQL Server "столбец идентичности", a PostgreSQL или Informix серийный, Oracle или SQL Server ПОСЛЕДОВАТЕЛЬНОСТЬ или столбец, определенный с помощью АВТОМАТИЧЕСКОЕ ПРИРАЩЕНИЕ в MySQL ). Некоторые базы данных предоставляют UUID /GUID как возможный тип данных для суррогатных ключей (например, PostgreSQL UUID или SQL Server УНИКАЛЬНЫЙ ИДЕНТИФИКАТОР ).

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

В временная база данных, необходимо различать суррогатный ключ и бизнес-ключ. Каждая строка будет иметь как бизнес-ключ, так и суррогатный ключ. Суррогатный ключ идентифицирует одну уникальную строку в базе данных, бизнес-ключ идентифицирует одну уникальную сущность моделируемого мира. Одна строка таблицы представляет отрезок времени, содержащий все атрибуты объекта в течение определенного периода времени. Эти срезы отражают всю продолжительность жизни одного бизнес-объекта. Например, стол СотрудникКонтракты может содержать временную информацию для отслеживания рабочего времени по контракту. Бизнес-ключ для одного контракта будет идентичным (неуникальным) в обеих строках, однако суррогатный ключ для каждой строки уникален.

SurrogateKeyBusinessKeyИмя сотрудникаРабочие часы в неделюRowValidFromRowValidTo
1BOS0120Джон Смит402000-01-012000-12-31
56P0000123Боб Браун251999-01-012011-12-31
234BOS0120Джон Смит352001-01-012009-12-31

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

Некоторые из альтернативных имен («ключ, сгенерированный системой») описывают способ создание новые суррогатные ценности, а не природа суррогатной концепции.

Подходы к созданию суррогатов включают:

Преимущества

Стабильность

Суррогатные ключи обычно не меняются, пока существует строка. Это дает следующие преимущества:

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

Изменения требований

Атрибуты, которые однозначно идентифицируют объект, могут измениться, что может сделать недействительными естественные ключи. Рассмотрим следующий пример:

В качестве естественного ключа выбрано имя пользователя сети сотрудника. При слиянии с другой компанией необходимо добавить новых сотрудников. Некоторые из новых сетевых имен пользователей создают конфликты, потому что их имена пользователей были созданы независимо (когда компании были отдельными).

В этих случаях обычно к естественному ключу должен быть добавлен новый атрибут (например, original_company столбец). С суррогатным ключом должна быть изменена только таблица, которая определяет суррогатный ключ. С естественными ключами все таблицы (и, возможно, другое связанное программное обеспечение), которые используют естественный ключ, должны будут измениться.

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

Спектакль

Суррогатные ключи, как правило, представляют собой компактный тип данных, например четырехбайтовое целое число. Это позволяет базе данных запрашивать один ключевой столбец быстрее, чем несколько столбцов. Более того, неизбыточное распределение ключей приводит к B-дерево Индекс должен быть полностью сбалансированным. Суррогатные ключи также обходятся дешевле (меньше столбцов для сравнения), чем составные ключи.

Совместимость

При использовании нескольких систем разработки приложений баз данных, драйверов и объектно-реляционное отображение системы, такие как Рубин на рельсах или Спящий режим, гораздо проще использовать целочисленные или суррогатные ключи GUID для каждой таблицы вместо естественных ключей, чтобы поддерживать операции, не зависящие от системы базы данных и сопоставление объектов с строками.

Единообразие

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

Проверка

Можно создавать пары "ключ-значение", следуя хорошо известному шаблону или структуре, которая может быть проверена автоматически. Например, ключи, которые предназначены для использования в каком-либо столбце некоторой таблицы, могут быть разработаны так, чтобы «выглядеть иначе», чем те, которые предназначены для использования в другом столбце или таблице, тем самым упрощая обнаружение ошибок приложения, в которых ключи были неуместны. Однако эта характеристика суррогатных ключей никогда не должна использоваться для управления какой-либо логикой самих приложений, так как это нарушит принципы Нормализация базы данных.

Недостатки

Диссоциация

Значения сгенерированных суррогатных ключей не имеют отношения к реальному миру. смысл данных, хранящихся в строке. При проверке строки, содержащей ссылку внешнего ключа на другую таблицу с использованием суррогатного ключа, значение строки суррогатного ключа невозможно отличить от самого ключа. Каждый внешний ключ должен быть объединен, чтобы увидеть связанный элемент данных. Если соответствующие ограничения базы данных не были установлены или данные импортированы из устаревшей системы, где ссылочная целостность не использовался, возможно, значение внешнего ключа не соответствует значению первичного ключа и, следовательно, является недопустимым. (В этом отношении, C.J. Дата считает бессмысленность суррогатных ключей преимуществом. [5])

Чтобы обнаружить такие ошибки, необходимо выполнить запрос, в котором используется левый внешнее соединение между таблицей с внешним ключом и таблицей с первичным ключом, показывая оба ключевых поля в дополнение к любым полям, необходимым для различения записи; все недопустимые значения внешнего ключа будут иметь столбец первичного ключа как NULL. Необходимость в выполнении такой проверки настолько распространена, что Microsoft Access фактически предоставляет мастер «Найти несогласованный запрос», который генерирует соответствующий SQL-запрос после проведения пользователя через диалоговое окно. (Однако составить такие запросы вручную не так уж сложно.) Запросы «Найти несоответствующие» обычно используются как часть очистка данных процесс при наследовании устаревших данных.

Суррогатные ключи неестественны для данных, которые экспортируются и используются совместно. Особая трудность заключается в том, что таблицы из двух идентичных схем (например, схемы тестирования и схемы разработки) могут содержать записи, эквивалентные с точки зрения бизнеса, но имеющие разные ключи. Это можно смягчить, НЕ экспортируя суррогатные ключи, за исключением временных данных (наиболее очевидно, при выполнении приложений, которые имеют «живое» соединение с базой данных).

Когда суррогатные ключи заменяют естественные ключи, тогда специфичные для домена ссылочная целостность будет скомпрометирован. Например, в основной таблице клиентов один и тот же клиент может иметь несколько записей под разными идентификаторами клиентов, даже если естественный ключ (комбинация имени клиента, даты рождения и адреса электронной почты) будет уникальным. Во избежание компрометации НЕЛЬЗЯ заменять естественный ключ таблицы: он должен быть сохранен как уникальное ограничение, который реализован как уникальный индекс комбинации полей с естественным ключом.

Оптимизация запросов

Реляционные базы данных предполагают уникальную показатель применяется к первичному ключу таблицы. Уникальный индекс служит двум целям: (i) для обеспечения целостности объекта, поскольку данные первичного ключа должны быть уникальными для всех строк, и (ii) для быстрого поиска строк при запросе. Поскольку суррогатные ключи заменяют идентифицирующие атрибуты таблицы - естественный ключ - и поскольку идентифицирующие атрибуты, скорее всего, будут запрошенными, тогда оптимизатор запросов вынужден выполнять полное сканирование таблицы при выполнении вероятных запросов. Средство от полного сканирования таблицы - применить индексы к идентифицирующим атрибутам или их наборам. Где такие наборы сами по себе кандидат ключ, индекс может быть уникальным индексом.

Однако эти дополнительные индексы занимают дисковое пространство и замедляют вставку и удаление.

Нормализация

Суррогатные ключи могут приводить к дублированию значений в любом естественные ключи. Чтобы предотвратить дублирование, нужно сохранить роль естественных ключей как уникальные ограничения при определении таблицы с помощью оператора SQL CREATE TABLE или оператора ALTER TABLE ... ADD CONSTRAINT, если ограничения добавлены не сразу.

Моделирование бизнес-процессов

Поскольку суррогатные ключи неестественны, при моделировании бизнес-требований могут появиться ошибки. Затем бизнес-требования, опирающиеся на естественный ключ, необходимо преобразовать в суррогатный ключ. Стратегия состоит в том, чтобы провести четкое различие между логической моделью (в которой суррогатные ключи не появляются) и физической реализацией этой модели, чтобы гарантировать, что логическая модель верна и достаточно хорошо нормализована, а также гарантировать, что физическая модель является правильной. правильная реализация логической модели.

Непреднамеренное раскрытие

При использовании последовательных генераторов ключей может произойти утечка конфиденциальной информации. Вычитая ранее сгенерированный последовательный ключ из недавно сгенерированного последовательного ключа, можно узнать количество строк, вставленных за этот период времени. Это может показать, например, количество транзакций или новых счетов за период. Есть несколько способов решить эту проблему:

  • Увеличьте порядковый номер на случайную величину.
  • Создайте случайный ключ, например UUID

Случайные предположения

Последовательно генерируемые суррогатные ключи могут означать, что события с более высоким значением ключа произошли после событий с более низким значением. Это не обязательно верно, потому что такие значения не гарантируют временную последовательность, поскольку вставки могут выйти из строя и оставить промежутки, которые могут быть заполнены позже. Если важна хронология, дату и время необходимо записывать отдельно.

Смотрите также

Рекомендации

Цитаты

  1. ^ «Что такое суррогатный ключ? - Определение из Техопедии». Techopedia.com. Получено 2020-02-21.
  2. ^ Пэйв Холл, Дж. Оулетт, С. Дж. П. Тодд, «Отношения и сущности», Моделирование в системах управления базами данных (ред. Г. М. Нейссен), Северная Голландия, 1976.
  3. ^ http://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402
  4. ^ https://msdn.microsoft.com/en-us/library/ff878091.aspx
  5. ^ Си Джей Дэйт. Примат первичных ключей. Из "Написание реляционных баз данных, 1991-1994 гг. Аддисон-Уэсли, Ридинг, Массачусетс".

Источники