<На страницу назад | На страницу вперед >

3.7. Внешние ключи

Семантика внешних ключей

Если между двумя сущностями имеется специфическое отношение связи или категоризации, то атрибуты, входящие в первичный ключ родительской или общей сущности, наследуются в качестве атрибутов сущностью-потомком или категорией сущностью соответственно. Эти наследуемые атрибуты называются внешними ключами. Например, если существует отношение между сущностью ПРОЕКТ как родителем и сущностью ЗАДАНИЕ как потомком, то атрибуты первичного ключа сущности ПРОЕКТ будут наследуемыми атрибутами сущности ЗАДАНИЕ. Например, если атрибут ПРОЕКТ_ID являлся первичным ключом сущности ПРОЕКТ, то ПРОЕКТ_ID будет также наследуемым атрибутом или внешним ключом сущности ЗАДАНИЕ.

Наследуемый атрибут может использоваться в сущности в качестве. части или целого первичного ключа, альтернативного ключа или неключевого атрибута. Если все атрибуты первичных ключей сущности-родителя наследуются в качесте части первичного ключа сущности-потомка, то отношение, через которое эти атрибуты были унаследованы; называется идентифицирующим отношением. Если какой-нибудь из наследуемых атрибутов не является частью первичного ключа, то отношение называется неидентифицирующим отношением (см. раздел 3.2). Например, если задания имеют номера, уникальные только в пределах своего проекта, то для определения первичного ключа ЗАДАНИЯ необходимо соединить наследуемый атрибут ПРОЕКТ_ID с собственным атрибутом НОМЕР_ЗАДАНИЯ. Сущность ПРОЕКТ будет обладать идентифицирующим отношением с сущностью ЗАДАНИЕ. Если, с другой стороны, атрибут НОМЕР_ЗАДАНИЯ всегда уникален (даже для разных проектов), то наследуемый атрибут ПРОЕКТ_ID будет неключевым атрибутом сущности ЗАДАНИЕ. В этом случае сущность ПРОЕКТ будет обладать неидентифицирующим отношением с сущностью ЗАДАНИЕ.

В отношении категоризации и общая сущность, и сущности-категории изображают один и тот же предмет реального мира. Поэтому для всех сущностей-категорий первичный ключ наследуется через отношение категоризации из первичного ключа общей сущности. Например, ШТАТНЫЙ_СЛУЖАЩИЙ и СЛУЖАЩИЙ_ПОЧАСОВИК являются сущностями-категориями, а СЛУЖАЩИЙ является общей сущностью. Если атрибут НОМЕР_СЛУЖАЩЕГО является первичным ключом для сущности СЛУЖАЩИЙ, то он будет также первичным ключом для сущностей ШТАТНЫЙ_СЛУЖАЩИЙ и СЛУЖАЩИЙ_ПОЧАСОВИК.

В некоторых случаях сущность-потомок может иметь несколько отношений с одной и той же сущностью-родителем. Первичный ключ сущности-родителя появится для каждого отношения в качестве наследуемых атрибутов в сущности-потомке. Для данного экземпляра сущности-потомка значения наследуемых атрибутов могут быть различными для различных отношений, т.е. может быть ссылка на два разных экземпляра сущности-родителя. Например, спецификация некоторого устройства может изображаться двумя сущностями: ДЕТАЛЬ и УЗЕЛ. Сущность ДЕТАЛЬ в качестве сущности-родителя обладает двойным отношением с сущностью УЗЕЛ. Одна и та же деталь может служить как компонентой, из которой производится узел (т.е. деталь может быть компонентой одного или многих узлов), так и иногда быть узлом, в который собираются компоненты (т.е. деталь может быть узлом для одной или более деталей-компонент). Если НОМЕР-ДЕТАЛИ является первичным ключом для сущности ДЕТАЛЬ, то НОМЕР-ДЕТАЛИ дважды появляется в сущности УЗЕЛ в качестве наследуемого атрибута.

Когда отдельный атрибут наследуется более одного раза, для каждого случая должно назначаться имя роли. В предыдущем примере имена ролей НОМЕР_КОМПОНЕНТЫ и НОМЕР_УЗЛА могут назначаться для различения двух наследуемых атрибутов НОМЕР_ДЕТАЛИ. Имена ролей могут использоваться и при единственном появлении наследуемого атрибута для более точного выражения его смысла в контексте сущности-потомка, но это не является обязательным.

Синтаксис внешних ключей

Внешний ключ изображается с помощью помещения внутрь блока сущности имен наследуемых атрибутов, после которых следуют буквы FK в скобках (FK), см рис.3-9.

Рис. 3-9. Примеры синтаксиса внешних ключей

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

Имена ролей, как и имена атрибутов, являются грамматическими оборотами существительного. За именем роли следует имя наследуемого атрибута, отделенное точкой (см.рис.3-10).

Рис. 3-10. Синтаксис имени роли

Правила внешних ключей

  1. Каждая сущность должна содержать отдельный внешний ключ для каждого специфического отношения связи или категоризации, в котором эта сущность является сущностью-потомком или сущностью-категорией.
  2. Первичный ключ общей сущности должен наследоваться в качестве первичного ключа для каждой сущности-категории.
  3. Сущность не должна содержать двух полных внешних ключей, которые идентифицируют один и тот же экземпляр одной и той же родительской или общей сущности для каждого экземпляра сущности-потомка или сущности-категории (в противном случае существует только одно отношение и необходим только один внешний ключ).
  4. Каждый наследуемый атрибут сущности-потомка или сущности-категории должен представлять атрибут из первичного ключа связанной родительской или общей сущности. Наоборот, каждый атрибут первичного ключа родительской или общей сущности должен быть наследуемым атрибутом в связанной сущности-потомке или сущности-категории.
  5. Каждое присвоенное наследуемому атрибуту имя роли должно быть уникальным, а одному и тому же имени должен соответствовать один и тот же смысл. Кроме того, один и тот же смысл не может соответствовать различным именам, если только эти имена не являются псевдонимами.
  6. Один наследуемый атрибут может быть частью более чем одного внешнего ключа, если этот атрибут всегда имеет одно и то же значение для всех внешних ключей в любом данном экземпляре сущностей.

<На страницу назад | На страницу вперед >