Понятие функциональной зависимости.
Основополагающее понятие теории нормализации — понятие функциональной зависимости. Функциональная зависимость — это семантическое понятие, которое отражает определенную семантическую связь между атрибутами отношения.
Определение. Пусть в отношении существует множество атрибутов X. Некий атрибут или множество атрибутов А является функционально зависимым от X тогда и только тогда, когда каждой комбинации значений X соответствует одно и только одно значение А.
Рассмотрим атрибут Название_филиала отношения Филиал. Определенный филиал банка может иметь только один адрес. Поэтому каждому значению Название_филиала соответствует одно и только одно значение атрибута Адрес. В каждом филиале есть также только один менеджер.
Конкретное значение Название_филиала может быть связано с произвольным числом значений атрибутов Номер_счета и Баланс и с одним или двумя значениями атрибута Тип. Следовательно, эти атрибуты не являются функционально зависимыми от Название_филиала. Однако конкретному значению атрибута Номер_счета соответствует одно и только одно значение Баланс и Тип.
Если бы счетом мог распоряжаться только один клиент, то можно было бы попытаться установить функциональную зависимость от Номера_счета, но существует счет (348973), которым владеют два различных клиента.
Можно определять функциональную зависимость от любого множества атрибутов. Все примеры, приведенные выше, касались зависимости oт одного атрибута.
Функциональные зависимости — удобное средство выявления потенциальных ключей (атрибутов или множеств атрибутов, которые уникальным образом идентифицируют все кортежи отношения). Предположим, существует функциональная зависимость А от Х, и объединение А и X образует полное множество атрибутов отношения. Если каждый кортеж уникален, то каждая комбинация значений X встречается в таблице только однажды, поскольку ей соответствует в точности одно множество значений А, образующее остальную часть кортежа. Это не означает, что X обязательно является первичным ключом. Это так называемый потенциальный ключ.
Множество атрибутов образует первичный ключ, когда каждая комбинация его значений может встретиться только однажды. Каждое отношение имеет первичный ключ, образованный множеством всех его атрибутов. Однако такой первичный ключ редко используется в качестве идентификатора. Необходимо по-новому сформулировать наше определение первичного ключа. Первичный ключ — это потенциальный ключ, который не имеет избыточности (избыточность — это способность потенциального ключа содержать атрибуты, после удаления которых его все еще можно будет использовать для уникальной идентификации всех кортежей отношения). Первичный ключ — это минимальное (несократимое) множество атрибутов, которое позволяет уникальным образом идентифицировать кортежи. Чтобы найти потенциальные ключи, необходимо сократить все потенциальные ключи до минимальных множеств атрибутов, необходимых для уникальной идентификации кортежей.
Например, отношение Филиал имеет следующий потенциальный ключ:
Название_филиала, Адрес, Номер_счета, Баланс, Тип,
означающий, что каждая строка этого отношения уникальна.
Как уже отмечалось, такой ключ не имеет особого смысла. Его можно сократить, например, так:
Название_филиала, Адрес, Номер_счета, Баланс,
поскольку каждой комбинации атрибутов левой части соответствует одно и только одно значение Тип.
Можно продолжить сокращение:
Название_филиала, Адрес, Номер_счета
Конкретной комбинации атрибутов Название_филиала, Адрес может соответствовать много разнообразных комбинаций Номер_счета, Баланс, Тип. Следовательно, сократить потенциальный ключ, следующим образом нельзя:
Название_филиала, Адрес,
т.е. комбинация Название_филиала, Адрес не может быть первичным ключом данного отношения. Все первичные ключи — подмножества потенциального ключа, поэтому ни Название_филиала, ни Адрес не может быть первичным ключом. Однако можно сократить Название_филиала, Адрес, Номер_счета по-другому:
Название_филиала, Номер_счета и далее:
Номер_счета.
Больше сокращать нечего; это означает, что Номер_счета — первичный ключ отношения Филиал.
При поиске потенциального ключа отношения Клиент мы начнем с потенциального ключа
Номер_клиента; Имя_клиента; Адрес; Статус; Номер_счета.
Так сокращать можно: | Так сокращать нельзя: |
Номер_клиента; Статус; Номер_счета ¯ Номер_клиента; Номер_счета | Номер_клиента; Имя_клиента; Адрес; Статус (так как один клиент может иметь несколько счетов в одном филиале) |
Дальнейшее сокращение невозможно, так как существуют атрибуты, функционально независимые от атрибута Номер_счета или Номер_клиента, взятого в отдельности. Следовательно, ни один из этих атрибутов не может быть первичным ключом отношения. Таким образом, комбинация Номер_счета; Номер_клиента остается единственным первичным ключом данного отношения.
Итак, первичный ключ — это потенциальный ключ, который невозможно сократить (т.е. минимальный). Все атрибуты первичного ключа называются ключевыми атрибутами. Атрибуты, не являющиеся частью первичного ключа, называются неключевыми. В отношении Филиал можно выделить такие неключевые атрибуты, как Название_филиала, Адрес, Номер_менеджера, Баланс и Тип, а в отношении Клиент — атрибуты Имя, Адрес и Статус.