Классика баз данных - статьи

       

что реляционная модель не накладывает


Повторим, что реляционная модель не накладывает каких-либо ограничений на имена, за исключением требования их уникальности. В данном случае сложное имя a.xref.a*.x* является гарантировано уникальным. Важно, что сложное имя атрибута, возникающее при раскрытия ссылки, является корректным путевым выражением описанной ссылочной структуры. Таким образом, операция раскрытия ссылки сохраняет семантику данных, выражая сложность структуры объектов и связей между ними в сложном имени атрибута R-переменной.

Операция раскрытия ссылки позволяет организовывать ассоциативный доступ к данным объектов любого типа, связанного с объектами данного типа по ссылке. При этом доступ к данным возможен как по ссылке, так и в противоположном направлении (конечно, на самом деле используемое при этом отношение, являющееся результатом операции EXPAND, не подразумевает каких-либо направлений, поскольку поля, содержащие OID объектов, ссылочные поля, содержащие OID связанных объектов, и поля данных в них абсолютно равнозначны). Например, можно получить ссылки на объекты типа t, связанные по ссылке xref с теми объектами типа t*, у которых атрибут x* компонента a равен определённому значению, например

Object((t EXPAND a.xref)WHERE a.xref.a*.x* =1)

Операции раскрытия ссылки может применяться к вложенным ссылкам

(t EXPAND a.хref)EXPAND a.хref .a*.хref*

Заметим, что существование атрибутов с уточненными именами подразумевает обязательное выполнение операции раскрытия ссылки. Из этого следует, что эта операция может вызываться неявно. С учетом этого, предыдущее выражение может быть записано как

Object( t WHERE a.xref.a*.x* =1)

Замечание: В данном конкретном случае аналогичный результат может быть получен используя операцию выборки объектов по значениям, примененную к ссылке

Object(t WHERE a.xref< a*.x* =1>)

Эти варианты неравноценны как по своему смыслу, так и по способу вычисления.
В первом случае мы строим раскрытое по ссылке a.xref отношение типа t и затем из кортежей, содержащих атрибут a.xref.a*.x*, выбираем OID объектов.

Object( (t JOIN an.хref (t* RENAME Object(t*), a*.x1*, … , a*.xn* AS a.xref, a.xi.a*x1*, … , a.xi.a*xn*)) WHERE a.xref.a*.x* =1 )

Во втором случае мы сначала выбираем из отношения типа кортежи тех объектов, которые отвечают требуемым условиям, и затем используем этот результат при построении раскрытого по ссылке

a.xref отношения типа t. Object( t WHERE EXIST a.xref JOIN ( Object(t* WHERE a*.x* = 1))) )

По нашему мнению, второй вариант является более мощным. Например, трудно найти аналог в стиле первого варианта следующему выражению в стиле второго варианта

Object (t EXPAND a.xref< a*.x*=1, a*.x*=2 >))

Необходимо отметить, что операция раскрытия ссылки может применяться как к R-переменной типа t, так и к R-переменной компонента типа t.a. Выборка t [a.xref.a*.x*] по результату будет эквивалентна выборке t.a[xref.a*.x*]


Содержание  Назад  Вперед