Пример логической таблицы Назад В начало Вперед

Данный пример основан на демо-проекте. Однако в нем для простоты изложения опущен ряд моментов, не имеющих отношения к рассматриваемой теме. В частности проигнорированы объектно-ориентированные возможности 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 между таблицами "Картотека сотрудников" и "Проекты и этапы проектов". Т.е. над одним этапом проекта могут работать несколько сотрудников, и каждый сотрудник может участвовать в нескольких проектах.