КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Ссылки на объектОбъекты, хранимые в объектных таблицах, имеют одно преимущество перед объектами, хранимыми как атрибут строки: на них можно ссылаться. Ссылка есть уникальный внутренний идентификатор объекта (адрес объекта в базе данных), и получить его можно с помощью функции REF:
SELECT REF(a) FROM Addresses a;
Перед тем как подробно рассматривать такое понятие как ссылка на объект, стоит несколько слов сказать об организации ссылочной целостности при объектном подходе по сравнению с подходом реляционным. В реляционном подходе ссылочную целостность контролирует сама СУБД при помощи создаваемых пользователем внешних ключей. Причем, для того чтобы указать реальную связь объекта из одной реляционной таблицы с объектом из другой реляционной таблицы прописывается атомарное значение (значение первичного ключа главной таблицы, чаще всего являющееся целым числом). В случае объектного подхода, задача контроля ссылочной целостности полностью лежит на программисте. Несмотря на то, что в одной таблице можно сослаться на другую таблицу при помощи ссылки на объект, вопрос сохранности объектов, на которые указывают ссылки, самой СУБД не регулируется.
Примечание: ссылка представляет собой уникальный идентификатор таблицы, в которой содержится объект плюс уникальный идентификатор супертипа, от которого унаследован объект и, наконец, уникальный идентификатор строки таблицы (ROWID), на который ссылается объект. В итоге получается длинное число, которое можно использовать при сравнении с другими ссылками (например, для определения, ссылаются ли ссылки на объекты на объекты одного и тоже супертипа).
Для демонстрации работы со ссылками на объект несколько изменим структуру таблицы DEPARTMENTS:
ALTER TABLE DEPARTMENTS DROP (Addr); ALTER TABLE DEPARTMENTS ADD (Addr REF address_typ SCOPE IS Addresses);
Фраза SCOPE IS при определении типа как ссылки на существующий объект необязательна, но позволяет фактически ссылаться только на объекты какой-то определенной объектной таблицы. Если параметр SCOPE IS не указан, то подразумевается, что поле Addr в таблице Departments может ссылаться на объекты типа address_typ, которые могут находиться в какой угодно таблице. Другими словами, разные записи одного поля таблицы могут ссылаться на объекты, физически расположенные в разных таблицах.
UPDATE Departments d SET d.Addr= (SELECT REF(a) FROM Addresses a WHERE VALUE(a)= address_typ('141980', 'Дубна', 'Университетская, 19'));
Ссылочный тип отличается от реляционного FOREIGN KEY ограничения тем, что он обеспечивает выборку данных по значению, на которое указывает ссылка (не нужно внутреннее объединение таблиц внутри одного запроса):
Select d.Caption, DEREF(d.Addr).ZIP, DEREF(d.Addr).City, DEREF(d.Addr).Location From Departments d;
Примечание: функция DEREF применяется для явного раскрытия ссылки, то есть для получения объекта, который находится по указанному адресу. При этом СУБД самостоятельно определяет таблицу, из которой необходимо достать объект.
В отличие от внешнего ключа, поле-ссылка может указывать на несуществующий объект. Другими словами возникает понятие повисшей (не существующей ссылки). Этот факт можно выявить с помощью оператора DANGLING («повисший»):
-- удалим строку из таблицы Addresses; Delete from Addresses;
-- выберем строки, содержащие повисшие ссылки SELECT d.Caption FROM Departments d Where Addr IS DANGLING;
-- выберем строки, содержащие действительные ссылки SELECT d.Caption FROM Departments d Where Addr IS NOT DANGLING;
|