Нам нужно различать бизнес (или кандидатские) ключи и технические (или суррогатные) ключи. Бизнес-ключ - это элемент (ы) данных, которые однозначно идентифицируют эту строку в реальном мире . Технический ключ удобен для управления данными, генерируемыми некоторыми компьютерными процессами, такими как последовательность или sys_guid()
.
Да, использование технических ключей означает хранение избыточной информации, но это тот случай, когда практичность превосходит теорию. Первичные ключи не должны изменяться, но в реальной жизни они могут (например, люди меняют свое имя из-за различных жизненных событий). Технические ключи не имеют значения, поэтому не меняются. Бизнес-ключи часто являются составными ключами, что часто неудобно для принудительного применения внешних ключей (и иногда крайне нежелательно, например, когда бизнес-ключ является конфиденциальным элементом данных, таким как номер социального страхования).
Таким образом, таблицы обычно имеют столбец идентификатора в качестве первичного ключа, который используется для отношений внешнего ключа, и уникальное ограничение для принудительного применения бизнес-ключа.
В первом примере username
- это бизнес-ключ, а id
- технический ключ. Это одна из причин, почему у нас должно быть две модели данных. Логическая модель данных имеет сущность с именем user
с ключом-кандидатом username
. Физическая модель данных имеет таблицу с именем user
с первичным ключом id
и уникальным ключом username
.
Для вашего второго примера, кажется, вы моделируете доску вакансий ситуаций. Отношения между Работодателем и Работой одно к многим, то есть работодатель может рекламировать множество вакансий. Таким образом, таблица Job
имеет свой собственный первичный ключ id
плюс внешний ключ employer_id
, который ссылается на первичный ключ таблицы Employer
. Это означает, что мы можем найти все рабочие места для конкретного работодателя. Но поскольку таблица job
имеет свой собственный первичный ключ, мы можем идентифицировать каждую работу, чтобы мы могли отличить работу Дворник на Фармацевтические препараты Harrisons от работы Дворник в Ravi's Cash'n'Carry . (Что, кстати, показывает, зачем нам нужны технические ключи: представьте, если внешний ключ employer_id
представлял собой строку varchar2(128)
для каждой строки в таблице Job
.)
В логической модели данных employer_id
будет означать , подразумеваемое для сущности job
по ссылке на сущность employee
, но будет отображаться (на самом деле это может быть, это зависит от инструмента ). В физической модели столбец должен быть добавлен в зависимую таблицу, потому что ограничения базы данных (и соединения!) Физически нуждаются в столбце для работы.
Таким образом, мы видим, что нормализация применяется к представлению и хранению бизнес-данных, но практичность механизмов баз данных означает, что нам нужны дополнительные столбцы для управления данными.