Ссылочная целостность является важной для баз данных

Предисловие переводчика

Статья "Ссылочная целостность является важной для баз данных", написанная Майклом Блахой в 2005 г. специально для портала www.odbms.org, возможно, покажется очевидной, тривиальной и немного путанной специалистам в области реляционных баз данных. Но она и не адресована подобным специалистам. Основная идея состоит в том, что ссылочной целостностью нельзя пренебрегать и в области проектирования баз данных (не обязательно реляционных), и в области моделирования и разработки приложений (не обязательно приложений баз данных). Опыт автора показывает, что, несмотря на очевидную фундаментальность понятия ссылочной целостности, большая часть разработчиков программного обеспечения (в том числе, и приложений баз данных) совершенно не заботится о ссылочной целостности своих данных, что приводит к плачевным последствиям.

1. Введение

Ссылочная целостность – это ограничение базы данных, гарантирующее, что ссылки между данными являются действительно правомерными и неповрежденными. Ссылочная целостность является фундаментальным принципом теории баз данных и проистекает из той идеи, что база данных должна не только сохранять данные, но и активно содействовать обеспечению их качества. Вот несколько дополнительных определений, найденных в Web:

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

Заметим, что определения, взятые из Web, выражаются в терминах реляционных баз данных. Однако принципы ссылочной целостности применяются в более широком контексте. Ссылочная целостность применима как к реляционным, так и к объектно-ориентированным (ОО) базам данных, а также к языкам программирования и моделированию.

2. Ссылочная целостность и РСУБД

Синтаксис SQL для определения ссылочной целостности выглядит, по существу, подобно следующему. Слова из прописных буква обозначают ключевые слова. Квадратные скобки выделяют необязательные параметры. Столбцы внешнего ключа находятся в таблице table1, а столбцы первичного ключа (или другой комбинации столбцов со свойством уникальности значений) – в таблице table2.

ALTER TABLE tableName1
ADD CONSTRAINT constraintName
FOREIGN KEY (columnList)
REFERENCES tableName2 [(columnList)]
[onDeleteAction] [onUpdateAction];

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

  1. Cascade. Удаление записи может привести к удалению записей с соответствующим значением внешнего ключа. Например, можно захотеть, чтобы при удалении записи о компании удалялись все адреса компании.
  2. No action. В качестве альтернативы можно запретить удаление записи, если имеются зависимые записи с соответствующим значением внешнего ключа. Например, если вы продали некоторой компании товары, то вы можете захотеть предотвратить удаление записи об этой компании.
  3. Set null. Удаление записи может приводить к установке в соответствующие внешние ключи неопределенного значения. Например, при замене самолета для выполнения рейса может понадобиться анулировать некоторые назначения посадочных мест. (Таким пассажирам придется запросить другие посадочные места.)
  4. Set default. Можно потребовать, чтобы при удалении записи во внешний ключ устанавливалось значение по умолчанию, а не неопределенное значение.

В стандарте SQL эти действия обеспечиваются и при модификации записей. Поддержка стандарта различается в разных продуктах.

  1. SQL Server. В SQL Server 2000 внешний ключ может ссылаться на первичный ключ или на комбинацию столбцов со свойством уникальности. Не поддерживаются опции set null и set default. Однако опции cascade и no action поддерживаются полностью, и на практике этого часто оказывается достаточно. Заметим также, что синтаксис для no action отличается от стандарта SQL. В SQL Server при отсутствии явного указания ссылочного действия подразумевается no action.
  2. Oracle. В Oracle 10g внешний ключ также может ссылаться на первичный ключ или на комбинацию столбцов со свойством уникальности. В Oracle поддерживаются ссылочные действия при удалении записей, но отсутствуют действия при модификации. Для действий при удалении поддерживаются опции cascade, no action и set null. Поддержка опции set default отсутствует. Как и в SQL Server, синтаксис no action отличается от стандарта SQL. При отсутствии явного указания ссылочного действия подразумевается no action.
  3. MySQL. Поддержка ссылочной целостности появилась в MySQL 5.0 (при использовании InnoDB). В MySQL стандарт SQL поддерживается в более полном объеме, чем в SQL Server и Oracle. Поддерживаются варианты on delete и on update со всеми четырьмя ссылочными действия. В MySQL требуется, чтобы для внешнего ключа и ключа, на который ведет ссылка, поддерживались индексы базы данных – это хороший обычай, которому мы советуем следовать.* Столбцы, на которые ведет ссылка, могут быть первичным ключом или комбинацией столбцов со свойством уникальности.
  4. MS-Access. В MS-Access команды SQL для определения ссылочной целостности поддерживаются только частично, но средство графического связывания является более сильным. С помощью графического интерфейса можно определить ссылочную целостность, а также ссылочные действия cascade и no action.

3. Ссылочная целостность и ООСУБД

Понятие ссылочной целостности применимо и к ООСУБД. Между объектами имеются связи, которые приводят к их взаимной зависимости, и поддержку этих зависимостей не следует возлагать на код приложения.

Ссылочная целостность поддерживается в некоторых ООСУБД . Например, в ObjectStore ссылочная целостность реализуется с использованием сдвоенных указателей между парой объектов, которые поддерживаются СУБД во взаимно согласованном состоянии . Таким образом, в ObjectStore сохраняется стиль языков программирования – указатель представляет собой всего лишь еще одну переменную экземпляра, скрытую внутри объекта. Однако в системе соблюдается и смысл ссылочной целостности путем поддержки зависимостей между объектами и предотвращения «висящих» ссылок.

Эти пары взаимно согласованных указателей называются в ObjectStore инверсными партнерами (inverse members). В ObjectStore поддерживается целостность инверсных партнеров; при изменении одного партнера ObjectStore прозрачным образом изменяет другого партнера. Аналогично, при удалении объекта ObjectStore автоматически обновляет всех инверсных партнеров, чтобы предотвратить появление «висящих» ссылок.

4. Ссылочная целостность и языки

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

Например, объект Занятость (Employment) ссылается на объекты Человек (Person) и Компания (Company). Невозможно иметь дело с изолированной Занятостью. Если удаляется Человек, то должны быть удалены и связанные с ним объекты Занятость, потому что иначе образуются «висящие» ссылки на объект. Нельзя создать объект Занятость без объектов Человек и Компания.

Как демонстриуется в , в языке программирования можно поддерживать ссылочную целостность. В GE R&D (General Electric Corporate Research and Development) Рэмбо (Rumbaugh) реализовал объектно-ориентиованный язык программирования DSM с семантической поддержкой зависимостей (называемых в статье отношениями) между объектами.

5. Ссылочная целостность и UML

При использовании UML за счет семантической поддержки ассоциаций также возникает ссылочная целостность. Ассоциация (association) – это описание группы соединений (link) с общей структурой и семантикой. Соединение – это физическая или концептуальная связь между объектами.

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

6. Используется ли ссылочная целостность?

Ссылочная целостность является выдающимся аспектом теории реляционных баз данных. Но действительно ли она используется на практике? Мы можем ответить на этот вопрос, поскольку на основе своих исследований в области обратной инженерии обладаем данными о 50 существующих базах данных.

На практике ссылочная целостность обеспечивается редко. Насколько нам известно, она не поддерживается в большинстве программ, поскольку в языках программирования отсутствует соответствующий механизм, что затрудняет поддержку. Однако проблема является более глубокой. В большинстве реализаций реляционных СУБД также отсутствует ссылочная целостность. Даже в тех случаях, когда в РСУБД поддерживается механизм ссылочной целостности, многие разработчики его не используют. Наши исследования в области обратной инженерии показали, что 90% разработчиков реляционных баз данных не используют ссылочную целостность в своих приложениях.

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

7. Заключение

Обычно термин «ссылочная целостность» ассоциируется только с реляционными СУБД. Но в действительности этот термин обладает более широким смыслом и относится в базам данных вообще, а также к языкам программирования и моделированию. Смысл «ссылочной целостности», происходящий из реляционных СУБД, относится к механизму реализации. Однако более глубокий смысл связан с зависимостями между объектами. В этом расширенном смысле ссылочная целостность является существенным аспектом нашего осмысления проблем и представления их на основе моделей. Поэтому ссылочную целостность необходимо учитывать вне зависимости от реализационной платформы – РСУБД, ООСУБД или языка программирования.

Источник: compdoc.ru