Различные объекты предметной области, информация о которых хранится в БД, всегда взаимосвязаны друг с другом.
Важно выяснить, каким образом данные, хранящиеся в отношениях Поставщик, Товар, Поставка связаны друг с другом. Эта связь определяется семантикой предметной области и описывается фразами: Один Поставщик может выполнять несколько Поставок, Один Товар может поставляться несколькими Поставками.
Это основной вид связи – один-ко-многим. Отношение, входящее в связь со стороны один, называют родительским отношением. Отношение, входящее в связь со стороны много, называется дочерним отношением.
Механизм реализации связи один-ко-многим состоит в том, что в дочернее отношение добавляются атрибуты, являющиеся ссылками на ключевые атрибуты родительского отношения. Эти атрибуты и являются внешними ключами, определяющими, с какими кортежами родительского отношения связаны кортежи дочернего отношения.
Взгляните на атрибут S# отношения SPJ. Ясно, что значение этого атрибута допустимо только в том случае, если такое же значение существует в качестве значения первичного ключа S# отношения S. Например, не имеет смысла включать в SPJ поставку для поставщика S8, если в отношении S не существует поставщика S8. Таким образом, атрибут S# отношения SPJ являются примером внешнего ключа.
Определение: Пусть R2 – базовое отношение. Тогда внешний ключ FK в отношении R2 – это подмножество множества атрибутов R2, такое что:(1) существует базовое отношение R1 с первичным ключом К,(2) каждое значение FK в текущем значении R2 является или null-значением, или совпадает со значением К некоторого кортежа в текущем значении R1.R1 – родительское отношение, R2 – дочернее отношение.
PS:
Внешний ключ, так же как и потенциальный может быть простым и составным.
Каждый атрибут входящий в данный внешний ключ, должен быть определен на том же домене, что и соответствующий атрибут первичного ключа.
Для внешнего не требуется, чтобы он был компонентом некоторого потенциального ключа (как было в нашем примере).
Null-значения для атрибутов внешнего ключа допустимы только в том случае, когда атрибуты внешнего ключа не входят в состав никакого потенциального ключа.
Так как внешние ключи фактически служат ссылками на кортежи в другом отношении, то эти ссылки не должны указывать на несуществующие объекты.