Основы проектирования реляционных баз данных

         

Первичные и внешние ключи


Понятие первичного ключа как уникального идентификатора кортежа отношения уже обсуждалось выше. Здесь нас интересует другой аспект данного понятия. А именно - то, что первичный ключ может гарантировать целостность данных. Если первичный ключ корректно используется, все кортежи отношения остаются различными и отсутствуют кортежи, у которых все атрибуты имеют нуль-значения. Напомним основные свойства первичного ключа:

  • отношение (таблица) может иметь только один первичный ключ;
  • первичный ключ должен быть уникальным;
  • первичный ключ должен быть минимальным, т.е. включать минимальное число атрибутов, необходимых для однозначной идентификации кортежа;
  • первичный ключ не может содержать нулевых значений;
  • значение первичного ключа не должно меняться при смене состояний базы данных.

Поддержка ссылочной целостности посредством первичного ключа осуществляется через его индекс. Уникальный индекс для первичного ключа отношения называется первичным индексом. Как правило, первичный индекс должен быть единственным для отношения. Если первичный индекс не создан, таблица реляционной базы данных находится в незавершенном состоянии. В такой таблице вы не можете искать, вставлять, удалять или модифицировать строки. Также невозможно создать внешний ключ для ссылки на первичный ключ таблицы.

Замечание. В СУБД Oracle 9i первичный индекс создается автоматически.

В конкретных реализациях СУБД существуют дополнительные ограничения на определение первичного ключа. Так, в SQLBase первичный ключ не может включать более 16 колонок, общая длина первичного ключа не может превышать 255 байт, нельзя использовать колонки типа LONG/LONG VARCHAR, в самоссылающихся строках значение первичного ключа невозможно модифицировать.

Внешний ключ представляет собой ссылку на первичный ключ в данной или другой таблице, т.е. один или несколько атрибутов отношения, которые содержат первичный ключ другого отношения. Примером внешнего ключа является номер отдела DEPNO в таблице EMPLOYEE нашей учебной базы данных.

Из определения следует, что внешний ключ может быть создан только после создания соответствующего первичного ключа (и первичного индекса).
Внешнему ключу обычно назначается специальное имя. Внешние ключи имеют следующие свойства:

  • Внешний ключ должен содержать такое же число колонок, такого же типа и в том же порядке следования, что и соответствующий первичный ключ.
  • Имена колонок внешнего ключа и их значения по умолчанию могут отличаться от используемых в соответствующем первичном ключе (в том числе иметь нуль-значения).
  • Таблица может иметь любое число внешних ключей.
  • Упорядочение значений колонок внешнего ключа в его индексе может отличаться от соответствующего первичного ключа.
  • Внешний ключ не может ссылаться на виртуальную таблицу.


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

В SQLBase существуют ограничения на определение внешнего ключа:

  • Внешний ключ не может содержать более 16 колонок.
  • Внешний ключ может ссылаться только на первичный ключ родительской таблицы, которая должна находиться в той же базе данных.
  • Внешний ключ не может ссылаться на таблицу системного каталога.


В других СУБД ограничения на определение внешнего ключа носят аналогичный характер.


Содержание раздела