Ссылочная целостность |
Когда все значения одного из полей таблицы должны быть представлены в поле другой таблицы, это означает, что поле ссылается на (refers to) или является ссылкой (references) на таблицу. Это свидетельствует о прямой связи между значениями двух полей. Например, каждый сотрудник имеет поле cPost, которое указывает на его должность, и поле cDepartment, которое указывает на подразделение в котором сотрудник работает. Параметры должности, включая ее наименование, определены в таблице KatPosts, а параметры подразделения определены в таблице KatDeps.
Когда поле таблицы ссылается на другое поле (в другой таблице) оно называется внешним ключом (foreign key). Поле, на которое ссылается внешний ключ, называется его родительским ключом (parent key). Таким образом, поля cPost и cDepartment таблицы KatPersons являются внешними ключами, а поля NRec в таблицах KatPosts и KatDeps, на которые они ссылаются - соответствующими им родительскими ключами.
Внешний ключ может быть определен на любом количестве полей, которые все вместе рассматриваются как единое целое. Однако наиболее часто на практике используются внешние ключи, определенные на единственном поле.
В качестве родительского ключа как правило удобнее всего использовать первичный ключ. Имея внешний ключ, у которого нет никакого другого назначения кроме связывания строк, и первичный ключ, который не имеет никакого другого назначения кроме идентифицирования строк, легко сохранить структуру базы данных ясной и простой и уменьшить вероятность появления проблем.
Если поле является внешним ключом, то оно связано с таблицей, на которую ссылается. Т.е. каждое значение в этом поле (внешнем ключе) непосредственно связано со значением в другом поле (родительском ключе). Каждое значение (каждая строка) внешнего ключа ссылается на одно значение (строку) родительского ключа. Это означает, что система находится в состоянии ссылочной целостности.
Из утверждения, что данное значение внешнего ключа может ссылаться только на одно значение родительского ключа, не следует, что верно и обратное. Любое число внешних ключей может ссылаться (и как правило ссылается) на одно и то же значение родительского ключа.
Ссылочная целостность может быть описательной, ограничивающей, ограничивающей с нулевыми ссылками.
Описательная ссылочная целостность декларирует наличие связи между таблицами, но не контролирует корректность этой связи. Другими словами внешний ключ может содержать ссылку на несуществующую запись.
Ограничивающая ссылочная целостность включает контроль корректности сылки. Внешний ключ должен содержать ссылку на существующую запись, в противном случае занесение данных в базу блокируется.
Ограничивающая ссылочная целостность с нулевыми ссылками включает контроль корректности сылки. Внешний ключ должен содержать ссылку на существующую запись или нулевое значение. Нулевое значение означает, что ссылка не определена.
Для описания ссылочной целостности на языке ref в описании поля таблицы (см. описание таблицы KatPersons в "Таблицы модуля "Управление персоналом". "):
можно воспользоваться кострукциейcDepartment : ref(KatDeps) restrict "Подразделение"
Приведенное описание означает, что поле cDepartment таблицы KatPersons является внешним ключом, а его родительский ключ является первичным ключом таблицы KatDeps. Т.е. поле cDepartment таблицы KatPersons ссылается на поле NRec таблицы KatDeps. Описанная ссылочная целостность является ограниченой, т.е. поле cDepartment должно содержать правильную ссылку. В противном случае добавление /корректировка записи в БД будет заблокирована.
Конструкция ref является упрощенным, удобным в большинстве случаев способом описать ссылочную целостность. Другой, более мощный способ описания ссылочной целостности - использование конструкции foreign key оператора alter table.
Эта конструкция, в отличие от ref, позволяет задавать нулевые значения для ограничивающей ссылочной целостности с нулевыми ссылками. При использовании конструкции ref используются нулевые значения по умолчанию (ноль для числовых, пробел для текстовых). Для ссылки на поле NRec ноль является естественным значением, указывающим на то, что ссылка не заполнена.
Конструкции foreign key позволяет также описывать переключаемую ссылочную целостность. Переключаемая ссылочная целостность используется в ситуациях, когда таблица ссылается не на одну, а на несколько таблиц в зависимости от значения некоторого поля-переключателя.