Другой пример конфликта фактов происходит, когда нарушена 3НФ.
Если включить атрибуты «Дата рождения» и «Возраст» в сущность «Ребенок» (см. табл. 19), то будет нарушена ЗНФ, так как атрибут «Возраст» функционально зависит от атрибута «Даты рождения». Зная дату рождения, всегда можно получить возраст ребенка.
Производные атрибуты – это атрибуты, которые могут быть вычислены из других атрибутов (например, «Возраст»), и следовательно, могут не сохраняться в БД. Чтобы быть точными, производные атрибуты должны модифицироваться каждый раз, когда источник их образования модифицируется. Это создает большие непроизводительные затраты в приложении, которое делает модификации.
Таблица 18.11. Экземпляры сущности Ребенок
Сотрудник# |
Ребенок# |
Имя ребенка |
Дата рождения |
Возраст |
Е1 |
С1 |
Коля |
01.09.00 |
10 |
Е2 |
С1 |
Маша |
01.08.98 |
12 |
Е2 |
С2 |
Оля |
02.07.05 |
5 |
Цель нормализации состоит в том, чтобы гарантировать, что имеется только один способ узнать каждый факт, записанный в БД. Если же вы можете получить ответ двумя разными способами, возможно, что два ответа будут различны.
Сущность «Ребенок» имеет атрибуты «Дата рождения» и «Возраст». Предположим, что атрибут «Возраст» модифицируется в конце месяца. Затем вы задаете запрос: какого возраста ребенок? Вы можете непосредственно обратиться к атрибуту «Возраст» и получит ответ. Также вы можете вычесть «Дату рождения» от сегодняшней даты и тоже получить ответ. Если «Возраст» не модифицировался недавно, то вы получите неправильный ответ. То есть при наличии в БД производных атрибутов, в ней всегда имеется потенциал для конфликтующих ответов.