Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

18.4. Отсутствующие значения и ключи

Замечание. Далее вместо термина ШК.мы будем (в основном, по историческим при- чинам) использовать более традиционную терминологию, т.е. термин NULL.

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

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

Как уже отмечалось в разделе 8.8, исторически сложилось так, что в реляционной модели, по крайней мере в базовых переменных-отношениях, один (и только один) по- тенциальный ключ должен быть выбран в качестве первичного ключа переменной- отношения. Все остальные потенциальные ключи (если таковые имеются) считаются альтернативными. Помимо концепции первичного ключа, в эту модель по некоторым историческим причинам входит следующее "метаограничение" или правило сохранения целостности сущности.

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

Обоснование этого ограничения построено на приведенной ниже последовательности умозаключений.

  1. Кортежи базовых переменных-отношений представляют сущности реального мира.

  2. Сущности реального мира всегда должны допускать возможность их идентифика- ции (по определению).

  3. Следовательно, их аналоги в базе данных также должны допускать возможность идентификации.

  4. В базе данных значения первичного ключа используются в качестве идентификаторов.

  5. Следовательно, значение любого первичного ключа не может быть "неопреде- ленным".

В связи с этим приведем ряд соображений.

  1. Прежде всего, часто ошибочно считается, что скрытый между строк смысл ограни- чения целостности сущности заключается в том, что "значения первичного ключа должны быть уникальными". (Действительно, значения первичного ключа должны быть уникальными, но это следует из самого определения первичного ключа.)

  2. Далее заметим, что это правило применимо только для первичных ключей, а аль- тернативные ключи могут содержать неопределенные значения (NULL). Но если некий ключ АК является альтернативным ключом, в котором допускаются неопре- деленные значения (NULL), то он не может использоваться в качестве первичного ключа, поскольку для него нарушается требование сохранения целостности сущно- сти. Тогда в каком смысле ключ АК является потенциальным? И наоборот, если вы- двинуть требование, что альтернативные ключи не могут содержать неопределен- ные значения (NULL), то правило сохранения целостности сущности будет отно- ситься ко всем потенциальным ключам, а не только к первичным ключам. В любом из этих двух вариантов указанное правило выглядит не вполне корректно.

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

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

Замечание. Допустим, что мы отказались от идеи применять неопределенные значе- ния (NULL) и для представления недостающей информации вместо них использовали спе- циальные значения аналогично тому, как это делается в реальном мире (подробности приводятся в разделе 18.6). Тогда модифицированная версия правила сохранения цело- стности сущности будет иметь следующий вид: "Никакой компонент первичного ключа любой базовой переменной-отношения не может содержать подобных специальных зна- чений". Это требование может использоваться как рекомендация, но не является непре- ложным законом (так же, как идеи дальнейшей нормализации служат в качестве реко- мендаций, а не строгих законов). На рис. 18.2 приведен пример (взятый из [5.7]) базовой переменной-отношения SURVEY, для которой может потребоваться нарушить эту реко- мендацию. В ней представлены результаты опроса сотрудников о размере их зарплаты, которые включают среднее, максимальное и минимальное значения для группы сотруд- ников с определенным годом рождения. (Здесь атрибут BIRTHYEAR является первичным ключом.) Кортеж со специальным значением ???? атрибута BIRTHYEAR представляет тех служащих, которые постеснялись ответить на вопрос о годе рождения.

SURVEY

BIRTHYEAR

AVGSAL

MAXSAL

MINSAL

1960

85К

130K

33K

1961

82К

125K

32K

1962

77К

99K

32K

1963

78К

97K

35K

1970

29К

35K

12K

????

56К

117K

20K

Рис. 18.2. Пример значений данных в переменной-отношении SURVEY

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

Еще раз обратимся к базе данных отделов и сотрудников, содержимое которой пока- зано на рис. 18.1. Возможно, вы не обратили на это внимания, однако в свое время я на- меренно не сказал, что на данном рисунке атрибут DEPTI переменной-отношения ЕМР яв- ляется внешним ключом. Предположим теперь, что это так. Сразу становится понятно следующее: требуется уточнить формулировку определения ограничений ссылочной це- лостности с учетом того, что внешние ключи могут содержать неопределенные значения (NULL), а это, очевидно, противоречит исходной формулировке данного ограничения, приведенной в главе 8.

■ Ограничение ссылочной целостности (исходная формулировка). База данных не должна содержать никаких несогласованных значений внешних ключей.

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

Здесь следует отметить такие важные особенности.

  1. Запрет или разрешение на присутствие неопределенных значений (NULL) в данном внешнем ключе должно задаваться в определении базы данных. (Конечно, в дейст- вительности это требование справедливо в отношении всех атрибутов в целом, не- зависимо от того, являются ли они частью некоторого внешнего ключа.)

  2. Возможность присутствия неопределенных значений (NULL) во внешних ключах требует введения нового типа ссылочного действия, SET NULL, которое можно бу- дет указывать в правилах DELETE и UPDATE при определении внешних ключей.

VAR SP BASE RELATION { ... } ...

FOREIGN KEY { St } REFERENCES S

ON DELETE SET NULL ON UPDATE SET NULL ;

При использовании этих спецификаций операция DELETE в переменной-отношении поставщиков приведет к помещению неопределенных значений (NULL) в атрибут внешнего ключа всех кортежей с данными о соответствующих поставках, и только после этого сведения об указанных поставщиках будут удалены. Аналогично опе- рация UPDATE для атрибута Sf в переменной-отношении поставщиков вызовет по- мещение неопределенных значений (NULL) в атрибут внешнего ключа всех корте- жей с данными о соответствующих поставках, и только после этого сведения об указанных поставщиках будут обновлены.

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

3. Наконец, следует отметить, что "необходимости" разрешить присутствие неопре- деленных значений (NULL) во внешних ключах вполне можно избежать за счет со- ответствующего проектирования базы данных [18.20]. Еще раз обратимся к приме- ру с отделами и сотрудниками. Возможна ситуация, когда некоторые сотрудники действительно не относятся ни к одному из отделов. Но тогда, как уже предполага- лось в конце предыдущего раздела, логичнее было бы не включать атрибут номера отдела DEPTI в переменную-отношение ЕМР, а создать отдельную переменную- отношение ED с атрибутами EMPI и DEPT#, предназначенную для представления того факта, что указанный сотрудник работает в данном отделе. Если некоторый со- трудник не относится ни к одному отделу, ситуацию легко можно представить, ис- ключив кортеж для этого сотрудника из переменной-отношения ED.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]