Формализация предметной области
Допустим, у нас есть простая БД для теннисного клуба. Выделим следующие сущности:
- Корты
- Клиенты
- Тарифы
- Резервы
Полагаем, что тариф зависит от корта и того, является ли клиент членом клуба.
Каждая сущность обладает неким набором атрибутов. Запишем эти атрибуты и укажем тип значения для каждого из них.
- Корты:
- № Корта : Целое
- Клиенты:
- ФИО : Строка
- Член клуба : Булево1
- Тарифы:
- Название : Строка
- Цена в час : Дробное
- № Корта : Целое
- Для членов : Булево
- Резервы:
- Клиент : Ссылка
- Тариф : Ссылка
- № Корта : Целое
- Время начала : Дата/время
- Продолжительность : Время
Заметим, что (Член клуба) и (Для членов) принимают значения “Да” и “Нет” одновременно, и, следовательно, могут считаться эквивалентными. Так же, поскольку понятие “Ссылки” в реляционной модели отсутствует, выберем или введем атрибуты, которые могут служить в качестве ссылки:
Введем атрибут (Клиент : Целое) для идентификации сущности “Клиент” и выберем (Название тарифа) для идентификации сущности “Тариф”.
Тогда можно вывести следующие ФЗ:
- Клиент → ФИО
- Клиент → Член клуба
- Название тарифа → Цена в час
- (№ Корта, Время начала) → Клиент
- (№ Корта, Время начала) → Продолжительность
- (№ Корта, Время начала) → Название тарифа
- (Член клуба, № Корта) → Название тарифа
Нахождение неприводимого множества ФЗ
Проверим каждую из полученных ФЗ на предмет того, выводится ли она из всех остальных.
Рассмотрим ФЗ (Клиент → ФИО)
Исключая исследуемую зависимость из множества всех зависимостей, построим замыкание атрибутов в левой ее части.
Множество ФЗ:
- Клиент → Член клуба
- Название тарифа → Цена в час
- (№ Корта, Время начала) → Клиент
- (№ Корта, Время начала) → Продолжительность
- (№ Корта, Время начала) → Название тарифа
- (Член клуба, № Корта) → Название тарифа
Замыкание:
- (Клиент)⁺ = (Клиент)
- (Клиент)⁺ = (Клиент, Член клуба)
(ФИО) не является подмножеством (Клиент)⁺, следовательно, исследуемая зависимость не выводится из остальных, и не может быть исключена.
Повторяя эту процедуру для всех остальных ФЗ, находим, что ((№ Корта, Время начала) → Название тарифа) может быть выведена из остальных. Действительно, построим замыкание атрибутов (№ Корта, Время начала)⁺:
- (№ Корта, Время начала)⁺ = (№ Корта, Время начала)
- (№ Корта, Время начала)⁺ = (№ Корта, Время начала, Клиент, Продолжительность)
- (№ Корта, Время начала)⁺ = (№ Корта, Время начала, Клиент, Продолжительность, ФИО, Член клуба)
- (№ Корта, Время начала)⁺ = (№ Корта, Время начала, Клиент, Продолжительность, ФИО, Член клуба, Название тарифа)
- (№ Корта, Время начала)⁺ = (№ Корта, Время начала, Клиент, Продолжительность, ФИО, Член клуба, Название тарифа, Цена в час)
(Название тарифа) входит в замыкание атрибутов (№ Корта, Время начала)⁺, следовательно, ((№ Корта, Время начала) → Название тарифа) выводится из остальных ФЗ, и может быть исключено:
- Клиент → ФИО
- Клиент → Член клуба
- Название тарифа → Цена в час
- (№ Корта, Время начала) → Клиент
- (№ Корта, Время начала) → Продолжительность
- (Член клуба, № Корта) → Название тарифа
Полученное множество ФЗ является неприводимым.
Булево в данном случае – это значение из булевой алгебры, т.е. множество значений (0,1), (Ложь, Истина), (Нет, Да) или любое эквивалентное.↩︎