16.10. Целостность: внешние ключи

Различные объекты предметной области, информация о которых хранится в БД, всегда взаимосвязаны друг с другом.

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

Это основной вид связи – один-ко-многим. Отношение, входящее в связь со стороны один, называют родительским отношением. Отношение, входящее в связь со стороны много, называется дочерним отношением.

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

Взгляните на атрибут S# отношения SPJ. Ясно, что значение этого атрибута допустимо только в том случае, если такое же значение существует в качестве значения первичного ключа S# отношения S. Например, не имеет смысла включать в SPJ поставку для поставщика S8, если в отношении S не существует поставщика S8. Таким образом, атрибут S# отношения SPJ являются примером внешнего ключа.

Определение: Пусть R2 – базовое отношение. Тогда внешний ключ FK в отношении R2 – это подмножество множества атрибутов R2, такое что:(1) существует базовое отношение R1 с первичным ключом К,(2) каждое значение FK в текущем значении R2 является или null-значением, или совпадает со значением К некоторого кортежа в текущем значении R1.R1 – родительское отношение, R2 – дочернее отношение.

PS:

  1. Внешний ключ, так же как и потенциальный может быть простым и составным.

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

  3. Для внешнего не требуется, чтобы он был компонентом некоторого потенциального ключа (как было в нашем примере).

  4. Null-значения для атрибутов внешнего ключа допустимы только в том случае, когда атрибуты внешнего ключа не входят в состав никакого потенциального ключа.

  5. Так как внешние ключи фактически служат ссылками на кортежи в другом отношении, то эти ссылки не должны указывать на несуществующие объекты.