Функциональные зависимости

Раздел: Проектирование баз данных

Функциональная зависимость (functional dependency) — это связь между атрибутами. Предположим, что если мы знаем значение одного атрибута, то можем вычислить (или найти) значение другого атрибута. Например, если нам известен номер счета клиента, то мы можем определить состояние его счета. В таком случае мы можем сказать, что атрибут СостояниеСчетаКлиента функциональ7ю зависит от атрибута НомерСчетаКлиента.
Говоря более общим языком, атрибут Y функционально зависит от атрибута X, если значение X определяет значение Y. Другими словами, если нам известно значение X, мы можем определить значение Y.
Уравнения выражают функциональные зависимости. Например, если мы знаем цену и количество приобретенного товара, мы можем определить стоимость покупки по следующей формуле:
Стоимость = Цена х Количество
В этом случае мы могли бы сказать, что атрибут Стоимость функционально зависит от атрибутов Цена и Количество.
Функциональные зависимости между атрибутами в отношении обычно не выражаются уравнениями. Пусть, например, каждому студенту присвоен уникальный идентификационный номер, и у каждого студента есть одна и только одна специальность. Имея номер студента, мы можем узнать его специальность, поэтому атрибут Специальность функционально зависит от атрибута НомерСтудента. Или рассмотрим компьютеры в вычислительной лаборатории. Каждый компьютер имеет конкретный размер основной памяти, поэтому атрибут ОбъемПамяти функционально зависит от атрибута СерийныйНомерКомпьютера.
В отличие от случая с уравнением, такие функциональные зависимости нельзя разрешить при помощи арифметики; вместо этого они хранятся в базе данных. Фактически, можно утверждать, что базу данных стоит иметь только ради хранения и выдачи функциональных зависимостей.
Функциональные зависимости обозначаются следующим образом:
НомерСтудента > Специальность СерийныйНомерКомпьютера > ОбъемПамяти
Первое выражение читается так: «атрибут НомерСтудента функционально определяет атрибут Специальность», «атрибут НомерСтудента определяет атрибут Специальность» или «атрибут Специальность зависит от атрибута НомерСтудента». Атрибуты по правую сторону от стрелки называются детерминантами (determinants).
Как уже говорилось, если номер студента определяет специальность, то каждому номеру студента соответствует только одна специальность. Между тем, одной и той же специальности может соответствовать более одного номера студента. Пусть студент под номером 123 специализируется на бухгалтерском учете. Тогда для любого отношения, где присутствуют столбцы НомерСтудента и Специальность, выполнится условие: если НомерСтудента = 123, то Специальность = Бух-галтерскийУчет. Обратное, однако, неверно: если Специальность = БухгалтерскийУчет, то атрибут НомерСтудента может принимать различные значения, так как на бухгалтерском учете может специализироваться много студентов. Следовательно, мы можем сказать, что связь атрибутов НомерСтудента и Специальность имеет вид N:l. В общем случае можно утверждать, что если А определяет В, связь между значениями А и В имеет вид N:l.
В функциональные зависимости могут быть вовлечены группы атрибутов. Рассмотрим отношение ОЦЕНКИ (НомерСтудента, Дисциплина, Оценка). Комбинация номера студента и дисциплины определяет оценку. Такая функциональная зависимость записывается следующим образом:
(НомерСтудента, Дисциплина) > Оценка
Заметьте, что для определения оценки требуется как номер студента, так и дисциплина. Мы не можем разделить эту функциональную зависимость, поскольку ни номер студента, ни дисциплина не определяют оценку сами по себе.
Обратите внимание на следующее различие. Если X > (Y, Z), то X > Y и X > Z. Например, если НомерСтудента > (ИмяСтудента, Специальность), то НомерСтудента > ИмяСтудента и НомерСтудента > Специальность. Но если (X, Y) >Z, то в общем случае неверно, что X > Y или X > Z. Следовательно, если (НомерСтудента, Дисциплина) > Оценка, то ни номер студента, ни дисциплина как таковые оценку не определяют.