Данный пример основан на демо-проекте. Однако в нем для
простоты изложения опущен ряд моментов, не имеющих отношения к
рассматриваемой теме. В частности проигнорированы
объектно-ориентированные возможности VIP, использованные в демо-проекте. Поэтому
приведенный пример на словаре демо-проекта компилироваться не
будет. Работающий пример см. в разделе "Реальный пример логической таблицы. ".
Пусть существуют 5 физических таблиц:
Код сотрудника (NRec)
Фамилия
Код должности
Код отдела
1
Иванов
3
2
2
Смирнов
3
3
3
Сидоров
2
1
Таблица KatPersons "Картотека сотрудников"
Код подразделения
Название подразделения
1
1-й отдел
2
2-й отдел
Таблица KatDeps "Каталог подразделений"
Код должности
Название должности
1
Дворник
2
Инженер
3
Начальник
Таблица KatPosts "Каталог должностей"
Код сотрудника
Код этапа
1
3
1
4
2
4
3
3
3
4
Таблица PrjExecutors "Исполнители"
Код этапа
Наименование этапа
Код проекта
Статус этапа
1
ПРОЕКТ1
0
Т
2
ПРОЕКТ2
0
П
3
Этап 1.1
1
Т
4
Этап 1.2
1
Т
5
Этап 2.1
2
П
Таблица Projects "Проекты и
этапы проектов"
Сформируем логическую таблицу, в
которую войдут все сотрудники за исключением Смирнова, их
должности, отделы и проекты, в которых они участвуют:
create view
as select
KatPersons.LastName, KatPosts.Name, KatDeps.Name,
Projects.Name
from
KatPersons, KatDeps, KatPosts, Projects, PrjExecutors
where
((
root == KatPersons.LastName
and (KatPersons.LastName <> 'Смирнов')
and KatPersons.cDepartment == KatDeps.NRec
and KatPersons.cPost == KatPosts.NRec
and KatPersons.NRec == PrjExecutors.cEmployee (noIndex)
and PrjExecutors.cMaster == Projects.NRec
))
;
ФИО
Должность
Отдел
Название проекта
Иванов
Начальник
2-й отдел
Этап 1.1
Иванов
Начальник
2-й отдел
Этап 1.2
Сидоров
Инженер
1-й отдел
Этап 1.1
Сидоров
Инженер
1-й отдел
Этап 1.2
Логическая таблица "Информация о сотруднике"
В приведенной конструкции where строка
and (KatPersons.LastName <> 'Смирнов')
является фильтром. Все остальные строки являются
подцепками узлов. Фильтр должен быть указан после подцепки
соответствующего узла. В данном случае - после подцепки таблицы
KatPersons. В приведенной логической таблице KatPersons является
корневой таблицей, поэтому единственным способом подцепить
KatPersons к логической таблице является использование ключевого
слова root:
root == KatPersons.LastName
Корневую таблицу можно цеплять к логической таблице
по любому полю.
Для узла PrjExecutors нет подходящего индекса,
поэтому необходимо указать атрибут noIndex. Это означает, что записи таблицы
PrjExecutors будут отбираться в выборку не по индексу, а по
фильтру, что снижает скорость заполнения логической таблицы.
Реляционный граф, отображающий эту таблицу, имеет
следующий вид:
Рис. 1. Реляционный граф логической таблицы
"Информация о сотруднике"
Дуга 1 задает отношение "=" типа n:1 между полями
"код подразделения" в таблицах "Картотека сотрудников" и "Каталог
подразделений".
Отношение типа n:1 означает, что каждой записи
таблицы "Картотека сотрудников" соответствует ровно одна запись
таблицы "Каталог подразделений". С другой стороны, в таблице
"Картотека сотрудников" может быть несколько записей с одинаковым
кодом отдела.
Дуга 2 задает отношение "=" типа n:1 между полями
"код должности" в таблицах "Картотека сотрудников" и "Каталог
должностей".
Дуга 3 задает отношение "=" типа 1:n между
полями"код сотрудника" в таблицах "Картотека сотрудников" и
"Исполнители".
Дуга 4 задает отношение "=" типа n:1 между полями
"код проекта" в таблицах "Исполнители" и "Проекты и этапы
проектов".
Использование таблицы "Исполнители" позволяет
организовать отношение типа m:n между таблицами "Картотека
сотрудников" и "Проекты и этапы проектов". Т.е. над одним этапом
проекта могут работать несколько сотрудников, и каждый сотрудник
может участвовать в нескольких проектах.