Майкл Блаха, Modelsoft Consulting Corp,
ODBMS.ORG
Перевод - Сергей Кузнецов
Ссылочная целостность – это ограничение базы данных, гарантирующее, что ссылки между данными являются действительно правомерными и неповрежденными. Ссылочная целостность является фундаментальным принципом теории баз данных и проистекает из той идеи, что база данных должна не только сохранять данные, но и активно содействовать обеспечению их качества. Вот несколько дополнительных определений, найденных в Web:
Поддержка ссылочной целостности в базе данных обеспечивает много преимуществ.
Заметим, что определения, взятые из Web, выражаются в терминах реляционных баз данных. Однако принципы ссылочной целостности применяются в более широком контексте. Ссылочная целостность применима как к реляционным, так и к объектно-ориентированным (ОО) базам данных, а также к языкам программирования и моделированию.
Синтаксис SQL для определения ссылочной целостности выглядит, по существу, подобно следующему. Слова из прописных буква обозначают ключевые слова. Квадратные скобки выделяют необязательные параметры. Столбцы внешнего ключа находятся в таблице table1, а столбцы первичного ключа (или другой комбинации столбцов со свойством уникальности значений) – в таблице table2.
ALTER TABLE tableName1
ADD CONSTRAINT constraintName
FOREIGN KEY (columnList)
REFERENCES tableName2 [(columnList)]
[onDeleteAction] [onUpdateAction];
В SQL внешний ключ может ссылаться на любую комбинацию столбцов со свойством уникальности в таблице, на которую ведет ссылка. В стандарте SQL [3] обеспечиваются следующие действия по поддержанию ссылочной целостности при удалениях строк.
В стандарте SQL эти действия обеспечиваются и при модификации записей. Поддержка стандарта различается в разных продуктах.
Понятие ссылочной целостности применимо и к ООСУБД. Между объектами имеются связи, которые приводят к их взаимной зависимости, и поддержку этих зависимостей не следует возлагать на код приложения.
Ссылочная целостность поддерживается в некоторых ООСУБД . Например, в ObjectStore ссылочная целостность реализуется с использованием сдвоенных указателей между парой объектов, которые поддерживаются СУБД во взаимно согласованном состоянии [1]. Таким образом, в ObjectStore сохраняется стиль языков программирования – указатель представляет собой всего лишь еще одну переменную экземпляра, скрытую внутри объекта. Однако в системе соблюдается и смысл ссылочной целостности путем поддержки зависимостей между объектами и предотвращения «висящих» ссылок.
Эти пары взаимно согласованных указателей называются в ObjectStore инверсными партнерами (inverse members). В ObjectStore поддерживается целостность инверсных партнеров; при изменении одного партнера ObjectStore прозрачным образом изменяет другого партнера. Аналогично, при удалении объекта ObjectStore автоматически обновляет всех инверсных партнеров, чтобы предотвратить появление «висящих» ссылок.
В языках программирования (с небольшим числом исключений) ссылочной целосности не придается значение. Вместо этого в них делается упор на инкапсуляции, на том, что детали реализации следует скрывать в классе. Проблема состоит в том, что инкапсуляция часто подрывается наличием зависимостей между объектами. Значение оказывается недостаточным для обеспечения ссылки на объект.
Например, объект Занятость (Employment) ссылается на объекты Человек (Person) и Компания (Company). Невозможно иметь дело с изолированной Занятостью. Если удаляется Человек, то должны быть удалены и связанные с ним объекты Занятость, потому что иначе образуются «висящие» ссылки на объект. Нельзя создать объект Занятость без объектов Человек и Компания.
Как демонстриуется в [4], в языке программирования можно поддерживать ссылочную целостность. В GE R&D (General Electric Corporate Research and Development) Рэмбо (Rumbaugh) реализовал объектно-ориентиованный язык программирования DSM с семантической поддержкой зависимостей (называемых в статье отношениями) между объектами.
При использовании UML за счет семантической поддержки ассоциаций также возникает ссылочная целостность. Ассоциация (association) – это описание группы соединений (link) с общей структурой и семантикой. Соединение – это физическая или концептуальная связь между объектами.
При конструировании моделей классов UML важно явно представить зависимости между объектами в виде ассоциаций и не скрывать их в виде атрибутов. Традиционные языки программирования вынуждают понижать статус ассоциаций, но они должны быть понятны, по крайней мере, на уровне мышления. Тогда можно придумать наилучший обходной путь в пределах возможностей языка.
Ссылочная целостность является выдающимся аспектом теории реляционных баз данных. Но действительно ли она используется на практике? Мы можем ответить на этот вопрос, поскольку на основе своих исследований в области обратной инженерии обладаем данными о 50 существующих базах данных [2].
На практике ссылочная целостность обеспечивается редко. Насколько нам известно, она не поддерживается в большинстве программ, поскольку в языках программирования отсутствует соответствующий механизм, что затрудняет поддержку. Однако проблема является более глубокой. В большинстве реализаций реляционных СУБД также отсутствует ссылочная целостность. Даже в тех случаях, когда в РСУБД поддерживается механизм ссылочной целостности, многие разработчики его не используют. Наши исследования в области обратной инженерии [2] показали, что 90% разработчиков реляционных баз данных не используют ссылочную целостность в своих приложениях.
Последствия прискорбны, и мы видем их повседневно – программное обеспечение содержит ошибки, работает медленно, его трудно расширять. Одним из характерных примеров может служить стандарт LDAP. В LDAP не включены средства подержки ссылочной целостности, и это приводит к печальным последствиям.
Обычно термин «ссылочная целостность» ассоциируется только с реляционными СУБД. Но в действительности этот термин обладает более широким смыслом и относится в базам данных вообще, а также к языкам программирования и моделированию. Смысл «ссылочной целостности», происходящий из реляционных СУБД, относится к механизму реализации. Однако более глубокий смысл связан с зависимостями между объектами. В этом расширенном смысле ссылочная целостность является существенным аспектом нашего осмысления проблем и представления их на основе моделей. Поэтому ссылочную целостность необходимо учитывать вне зависимости от реализационной платформы – РСУБД, ООСУБД или языка программирования.
[1] Michael Blaha and William Premerlani. Object-Oriented Modeling and Design for Database Applications. Upper Saddle River, New Jersey: Prentice Hall, 1998.
[2] Michael Blaha. A retrospective on industrial database reverse engineering projects—part 2. Eighth Working Conference on Reverse Engineering, October 2001, Stuttgart, Germany, 147–153.
[3] Jim Melton and Alan R. Simon. Understanding the New SQL: A Complete Guide. San Francisco, California: Morgan Kaufmann, 1993.
[4] James Rumbaugh. Relations as semantic constructs in an object-oriented language. OOPSLA’87 as ACM SIGPLAN 22, 12 (Dec. 1987), 466–481.
[5] en.wikipedia.org/wiki/Referential_integrity
[6] www.webopedia.com/TERM/R/referential_integrity.html
[7] computing-dictionary.thefreedictionary.com/referential+integrity
* Не могу не отметить наивность автора, связанную с его отдаленностью от аспектов реализации СУБД. Насколько мне известно, испокон веков, во всех развитых РСУБД, начиная с проекта System R, при объявлении в таблице возможных и внешних ключей система автоматически создавала индексы (уникальные для возможных ключей). (прим. переводчика).