3.3. Навигационные операции

Навигационные операции обеспечивают проход по записям одного типа и проход по записям, которые являются членами набора, владельцем которого является данная запись.
Рассмотрим пример навигационного языка для сетевой модели. В основе языка лежит механизм сканов (курсоров), которые являются средствами последовательного просмотра записей.
Команды:
CREATE SCAN <имя> ON <тип записи> [MEMBER <тип набора>]
- создает скан с указанным именем. Ключевое слово MEMBER позволяет создать скан не для всех записей типа, а только для записей - членов набора указанного типа, владельцем которого является текущая запись.
DROP SCAN <имя> - удаляет скан
GET NEXT <имя_скана> [WHERE <условие>] - выдача следующей записи, если указано условие, то следующей записи, удовлетворяющей условию. Операция выполняется в цикле. Если такого нет, то производится выход из цикла.
GET OWNER <тип набора> - перейти к собственнику текущей записи в наборе.
BEGIN <имя_скана>....END - ограничение тела цикла для скана. OUTPUT, DELETE - операции действий.
Пример. Определим преподавателей ФМФ, получающих зарплату больше 15000 р., удалим тех из них, у кого стаж меньше 2 лет.
C
REATE SCAN A ON ФАКУЛЬТЕТЫ BEGIN A
GET NEXT A WHERE название='ФМФ'
CRЕATE SCAN B ON КАФЕДРЫ MEMBER СОСТОЯТЬ_ИЗ BEGIN B
GET NEXT B
CREATE SCAN C ON ПРЕПОДАВАТЕЛИ MEMBER БЫТЬ_СОТР BEGIN C
GET NEXT C WHERE з\п>15000 OUTPUT C END
DROP SCAN C
CREATE SCAN D ON ПРЕПОДАВАТЕЛИ MEMBER БЫТЬ_СОТР BEGIN D
GET NEXT D WHERE (з\п>15000) AND (стаж<2)
DELETE D END
DROP SCAN D END
DROP SCAN B END
DROP SCAN A


 


Данный подход можно применить и для иерархической модели. При внимательном изучении, здесь будет виден еще один её недостаток. Поскольку каждую запись можно идентифицировать только по цепочке ключей (в иерархической модели - от корня к искомой записи), то в запросе приходится рассмотреть все записи на пути от корня до искомой вершины (см. рис. 16).

16. Просмотр записей при поиске

В сетевой модели этот недостаток также сохраняется, но более широкие возможности определения наборов позволяют иногда значительно сократить путь.
Что касается действий над излеченными данными, то возможна вставка новой записи, удаление или модификация данных (не все операции поддерживаются в рассмотренном выше примере языка). При удалении записи важно понимать, что удаление записи-владельца набора приводит к удалению всех записей-членов этого набора, которые в свою очередь могут быть владельцами других наборов, таким образом, происходит так называемое каскадное удаление связанных записей. Если в иерархической модели удаляется фактически все поддерево записи в графе знаков (рис. 17 ), то в сетевой модели каскадное удаление в случае сложных структур иногда может привести к непредсказуемым последствиям.
Такие эффекты могут возникать и в ER-модели, но здесь ситуация усложняется тем, что возможны ошибки при переходе к сетевой модели, которые могут привести к непредсказуемым последствиям.

Рис. 17. Удаление записи в иерархической модели