Алгоритм получения двухуровневой структуры сети
1. Для каждой функциональной зависимости вида А ® В создается файл Fi(A,B). Каждый блок взаимно однозначных соответствий также порождает файл с ключом, равным старшему по объему понятия атрибуту.
В нашем примере будут созданы следующие файлы (ключи помечены знаком #):
F1(НИИ #, Директор, Адрес),
F2(0тдел #, НИИ, Ксотр),
FЗ(Тема #, Датанач, Датакон, Приор),
F4(ФИО #, Отдел),
F5(Тема #, Работа #, ФИО #, Прод),
F6(Тема #, Заказ #, Обфин).
2. У всех пар файлов, полученных на шаге 1, проверяется условие для ключей (Ki является частью Kj). Если оно соблюдается, то из соответствующих файлов создается веерное отношение Wij(Fi,Fj).
В нашем примере получим W35(F3,F5), W45(F4,F5), W36(F3,F6).
3. Если на шаге 2 будут получены два веерных отношения Wij и Wjk, то все атрибуты файла Fi передаются в файл Fj, и Fi вместе с Wij уничтожаются.
В нашем примере таких веерных отношений нет.
4. Атрибуты, не вошедшие в состав веерных отношений на шаге 2, добавляются в те файлы Fn (и содержащие Fn веерные отношения), где они будут не ключевыми. При наличии нескольких подходящих файлов предпочтение отдается основным файлам. Если требуемые Fn отсутствуют, то создается новый файл из атрибутов первичного ключа, и повторяются шаги 2, 3,4.
В нашем примере F4 расширяется атрибутами НИИ, Директор, Адрес, Ксотр.
На рис.3.10 показана структура соответствующей двухуровневой БД.
Структуры основных отношений показаны в верхней части рисунка, а структуры зависимых отношений - внизу.
Перед рассмотрением операций в сетевой базе данных следует отметить, что существуют 2 различных подхода к обработке данных средствами СУБД.
1. Применение базового языка программирования. При этом подходе для манипулирования данными в СУБД разрабатывается универсальный язык программирования, обеспечивающий обращения к базе данных, работу с переменными и остальные возможности. Примером СУБД с базовым языком является dBASE.
2. Применение включающего языка программирования. Включающий язык - это обычный язык программирования (например, Delphi), в котором обращения к базе данных реализуются с помощью подпрограмм. Среди параметров, передаваемых подпрограмме, указываются название операции, имена обрабатываемых отношений и др. Включающий язык используется практически во всех известных сетевых СУБД. Это объясняется принципом доступа к данным в сетевой базе данных, который может быть назван навигационным.
Центральным для навигационного принципа доступа является понятие "текущая запись" в отношениях базы данных. Текущей записью в отношениях после выполнения некоторой операции является значение отношения, на котором операция завершилась. Далее операция начинается с этой текущей записи, а в результате выполнения операции положение текущей записи изменяется, (завершение операции может изменить положение текущей записи и в других отношениях).
Рассмотрим операции выборки для двухуровневой сетевой базы данных. Чтобы не пользоваться синтаксисом включающего языка, условимся записывать лишь название операции и условие выборки. Примеры выборки относятся к сетевой структуре, изображенной на рис.2.4. В этой базе данных на основном отношении Сотрудник и зависимом Зарплата установлены два веерных отношения Осн - основная зарплата и Доп - дополнительная зарплата.
1. Операция OBTNM - получить запись в основном отношении.
OBTNM (Сотрудник * "Иванов")
После выполнения указанной выборки в отношении Сотрудник в качестве текущей будет установлена запись со значением первичного ключа "Иванов". Затем атрибуты этой текущей записи обрабатываются средствами включающего языка (становятся значениями переменных, печатаются и т.п.).
2. Операция OBTNF - получить запись в зависимом отношении.
OBTNF(Сотрудник * "Иванов", Зарпл*0сн)
При выборке в зависимом отношении текущей записью становится следующая запись зависимого отношения относительно той, которая раньше была текущей в зависимом отношении. Условие выборки содержит указание на текущую запись в основном отношении, а также на имя зависимого отношения и имя веерного отношения.
В результате выполнения двух операторов
OBTNM (Сотрудник * "Иванов")
ОВТМР(Сотрудник * "Иванов", Зарпл*0сн)
при условии, что обращения к отношению Зарпл ранее не производились, будут получены сведения о первой (с момента поступления на работу) основной зарплате Иванова.
Средствами включающего языка может быть организован циклический процесс, и тогда возможны более сложные варианты доступа.
Рассмотрим, например, последовательность операций
OBTNM (Сотрудник * "Иванов")
Ml: OBTNF(Сотрудник * "Иванов", Зарпл*0сн)
print Зарпл
goto Ml
Оператор print печатает все атрибуты текущей записи отношения Зарпл. На первый взгляд использование безусловного перехода создает зацикливание при выполнении. Однако операторы выборки в сетевых СУБД по окончании выборки вырабатывают код возврата, и выход за последнюю запись в отношении Зарпл сопровождается специальным значением этого кода в команде OBTNF, означающим неудачное завершение выборки. Значение кода возврата всегда проверяется средствами включающего языка, и этим обеспечивается выход из цикла. Практически приведенная выше последовательность операций напечатает все сведения о получении Ивановым основной заработной платы.
В сетевых СУБД количество операций выборки достаточно велико. Мы рассмотрели минимально необходимое множество вариантов выборки. Остальные варианты выборки создают более удобные для прикладного программиста возможности реализации запросов.
Рассмотрим реализацию в сетевых СУБД функций, аналогичных операциям проекции и соединения для реляционных систем. Оказывается, что аналог операции проекции для сетевой СУБД не нужен, так как соответствующие функции выполняет описание подсхемы сетевой базы данных. Схемой сетевой БД называется описание всех отношений с указанием атрибутного состава и ключей каждого отношения, а также веерных отношений. В прикладной программе имеется возможность объявить часть отношений сетевой базы данных, в каждом отношении - некоторое подмножество атрибутов (с обязательным оставлением атрибутов-ключей) и лишь некоторые веерные отношения. Соответствующее описание данных называется подсхемой.. Отношения, веерные отношения и атрибуты, не указанные в подсхеме, становятся недоступными прикладной программе. В отличие от операции проекции база данных, соответствующая подсхеме, не создается физически, а происходит ограничение доступа к исходной БД, которая определена в схеме.
Аналог операции соединения в сетевой СУБД также не нужен, но по другой причине. Дело в том, что результаты допустимых соединений фактически зафиксированы в сетевой СУБД с помощью цепочек адресов связи. Доступ к результатам возможного соединения начинается от некоторого основного отношения к вееру значений в соответствующем зависимом отношении, достигаемые при этом значения ключей в зависимом отношении запоминаются и используются для поиска в каком-то другом основном отношении, от этого основного отношения возможен переход к новому зависимому и т.д.