Объектно-реляционная схема
Oracle8 – это ОР-СУБД, разработанная Oracle Corporation. Подобные продукты предлагаются и другими производителями баз данных, например фирмой IBM. В ОР-СУБД Oracle частично реализован стандарт SQL3. АТД носит в этой системе название «объектного типа» («object type»).
Рассмотрим, как в Oracle8 построены три базовых типа пространственных данных: Point, LineString и Polygon. CREATE TYPE Point AS OBJECT ( x NUMBER, y NUMBER, MEMBER FUNCTION Distance(P2 IN Point) RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(Distance, WNDS));
Тип Point имеет два атрибута x и y, а также одну функцию-член Distance. PRAGMA указывает на то, что функция Distance не изменяет состояние базы данных: WNDS (Write No Database State). Разумеется, в стандарте OGIS описано большое количество других операций, относящихся к типу Point, однако для простоты мы показали только одну. После создания тип Point может использоваться как тип атрибута в отношениях. Например, схему отношения City можно описать так: CREATE TABLE City ( Name varchar(30), Country varchar(35), Pop int, Capital char(1), Shape Point );
Когда схема отношения определена, таблицу, как обычно, можно заполнять данными. Например, следующий оператор добавляет в базу данных информацию, касающуюся столицы Бразилии, г. Бразилиа: INSERT INTO CITY(‘Бразилиа’, ‘Бразилия’, 1.5, ‘Д’, Point(-55.4,-23.2));
Создание типа данных LineString несколько сложнее аналогичной процедуры для типа Point. Начнем с создания промежуточного типа LineType: CREATE TYPE LineType AS VARRAY(500) OF Point;
LineType – это массив переменного размера, который состоит не более чем из 500 элементов типа Point. Если тип объявлен как Varray, то функции-члены этого типа описывать запрещено. Поэтому сконструируем другой тип LineString:
CREATE TYPE LineString AS OBJECT ( Num_of_Points INT, Geometry LineType, MEMBER FUNCTION Length(SELF IN) RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(Length, WNDS));
Атрибут Num_of_Points (количество точек) содержит размер (число элементов типа Point) каждого экземпляра типа LineString.
Теперь мы готовы кзаданию схемы таблицы River: CREATE TABLE River( Name varchar(30), Origin varchar(30), Length number, Shape LineString );
При добавлении данных в таблицу River нужно отслеживать различные используемые типы данных. INSERT INTO RIVER(‘Миссисипи’, ‘США’, 6000, LineString(3, LineType(Point(1,1),Point(1,2), Point(2,3)))
Тип Polygon аналогичен типу LineString. Последовательность операций описания типов, создания таблицы и добавления данных приведена в таблице 3.12.
Таблица 3.12. Последовательность операций при создании таблицы Country
CREATE TYPE PolyType AS VARRAY(500) OF Point (а) |
CREATE TYPE Polygon AS OBJECT ( Num_of_Points INT, Geometry PolyType , MEMBER FUNCTION Area(SELF IN) RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(Length, WNDS)); (б) |
CREATE TABLE Country( Name varchar(30), Cont varchar(30), Pop int, GDP number, Life-Exp number, Shape LineString ); (в) |
INSERT INTO Country(‘Мексика’, ‘СА’, 107.5, 694.3, 69.36, Polygon(23, Polytype(Point(1,1), ..., Point(1,1))) (г) |