Плохая нормализация отношений
Данный пример взят из книги Гилуа М.М. [6, стр.43].
Пример 16. Пусть имеется отношение ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ с набором атрибутов (Наименование вещества, Водород, Гелий, …, 105_элемент). Значением атрибута "Вещество" являются наименования химических веществ, значениями остальных атрибутов - процентный состав соответствующих элементов в этом веществе. Такое отношение могло бы иметь, к примеру, следующий вид:
Наименование вещества
Водород
Гелий
…
105 элемент
Дезоксирибону-клеиновая кислота | 5 | 3 | … | 0.01 |
Бензин | 50 | 0 | … | 0 |
… | … | … | … | … |
Таблица 24 Отношение ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ
Рассмотрим запрос "Найти все химические элементы, содержание которых в каком-либо из веществ превышает заданный процент (скажем, 90)".
С алгоритмической точки зрения этот запрос выполняется элементарно - просматриваются все столбцы таблицы, если в столбце присутствует хотя бы одно значение, большее 90, то запоминается заголовок этого столбца. Набор наименований запомненных столбцов и является ответом на запрос.
Формально невозможно выразить этот запрос в рамках реляционной алгебры, т.к. ответом на этот запрос должен быть список атрибутов отношений, удовлетворяющих определенному условию. В реляционной алгебре нет операторов, манипулирующих с наименованиями атрибутов.
На самом деле, этот пример показывает, что таблица плохо нормализована (нормализация отношений рассматривается в гл.6 и 7). В таблице есть набор однотипных атрибутов ("Водород", "Гелий" и т.д. в количестве 105 столбцов).
Правильнее разбить это отношение на три различных отношения:
НОМ_ВЕЩЕСТВА
ВЕЩЕСТВО
1 | Дезоксирибонуклеиновая кислота |
2 | Бензин |
Таблица 25 Отношение ВЕЩЕСТВО
НОМ_ЭЛЕМЕНТА
ЭЛЕМЕНТ
1 | Водород |
2 | Гелий |
… | … |
105 | … |
Таблица 26 Отношение ЭЛЕМЕНТЫ
НОМ_ВЕЩЕСТВА
НОМ_ЭЛЕМЕНТА
ПРОЦЕНТ
1 | 1 | 5 |
1 | 2 | 3 |
1 | 105 | 0.01 |
2 | 1 | 50 |
Таблица 27 Отношение ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ
Для отношений, нормализованных таким образом, исходный запрос реализуется следующей последовательностью операторов:
На языке SQL такой запрос реализуется одной командой:
SELECT ЭЛЕМЕНТЫ.ЭЛЕМЕНТ
FROM ЭЛЕМЕНТЫ, ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ
WHERE
ЭЛЕМЕНТЫ.НОМ_ЭЛЕМЕНТА=ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ.НОМ_ЭЛЕМЕНТА
AND ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ.ПРОЦЕНТ>90;