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

Основные понятия

Имеем некоторую схему отношения – R(A1A2…An). Функциональная зависимость представляет собой один из возможных типов зависимостей между атрибутами отношения. Она определяет, что:

1.значение одного подмножества атрибутов Y ⊆ R зависит от значения другого подмножества X ⊆ R. Например, в приведенном выше отношении ПОСТАВКА_ТОВАРОВ атрибут CITY зависит от атрибута S#;

2.одному и тому же значению X соответствует одно и то же значение Y.

Возможные способы определения функциональных зависимостей:

– есть конкретная реализация отношения r1(R), и для нее на основании анализа конкретных значений атрибутов можно определить функциональные зависимости;

– на основе анализа предметной области можно определить функциональные зависимости для всех возможных реализаций отношения r1(R), r2(R), … в разные моменты времени.

Конечно, для проектирования базы данных необходимо использовать второй способ.

Определение функциональной зависимости

Пусть R(A1A2…An) – схема отношения с атрибутами из некоторого универсального множества атрибутов U = {A1, A2, …, An}. Пусть также X ⊆ U и Y ⊆ U – некоторые подмножества множества атрибутов схемы R. Тогда говорят, что Y функционально зависит от X (или X функционально определяет Y) тогда и только тогда, когда для любой допустимой реализации отношения r(R) каждое значение множества атрибутов X связано в точности с одним значением множества атрибутов Y.

Формальная запись: f : X  Y

Здесь X – детерминант, а Y – зависимость.

Другими словами, для любой допустимой реализации отношения r(R) если какие-то два кортежа имеют одинаковые значения атрибутов из X, они обязательно имеют и одинаковые значения атрибутов из Y: πYX=x (r)) – всегда дает только один кортеж для любого значения x атрибутов X из r.

Примеры:

• Очевидный пример: так как первичный ключ PK однозначно определяет каждый кортеж отношения, PK  A1A2…An, а также и любое подмножество атрибутов из U.

• Из рассматриваемого примера ПОСТАВКА ТОВАРА очевидно, что

S#  SNAME

P#  PNAME

(S#,P#)  QTY

Важно! Функциональные зависимости являются утверждением обо всех реализациях отношения, которые удовлетворяют схеме отношения R. Нельзя, рассматривая конкретную реализацию отношения, на ее основе определить функциональные зависимости.

Рассмотрим пример. Пусть дана некоторая реализация отношения, удовлетворяющая схеме R:

R (S# P# QTY)
  S1 P1
  S1 P2
  S2 P1
  S2 P3
  S3 P1

 

Из приведенной реализации можно сделать вывод, что S#  QTY. Но в какой-то следующий момент времени в реализации отношения может появиться кортеж <S1, P3, 200>, который нарушает предполагаемую функциональную зависимость.

Как определять функциональные зависимости

Декларация функциональных зависимостей – решение, которое может быть принято только проектировщиком на основе анализа семантики атрибутов. Функциональные зависимости не могут быть доказаны, но они будут претворяться в жизнь средствами СУБД, если ей это предписано (это определяется установленными ограничениями целостности).

На что влияют функциональные зависимости

1. Функциональные зависимости гарантируют, что СУБД в дальнейшем будет поддерживать определенные ими ограничения целостности.

2. Возможно, обеспечат более эффективную реализацию отношения.

3. Но! Делают невозможным хранение некоторой информации.

Рассмотрим пример, иллюстрирующий важность определения функциональных зависимостей. Пусть, например, определена следующая схема отношения: ОТДЕЛ ( Название, Номер помещения, Телефон). Очевидно, что такая схема отношения определяет функциональную зависимость НазваниеТелефон. Возможная реализация отношения:

ОТДЕЛ (Название Номер помещения Телефон)

Бухгалтерия 128 123-4567

… … …

Это означает, что никакой отдел не может иметь несколько телефонов.

Еще один пример. Уже говорилось, что в любом отношении есть функциональная зависимость

PK  R. Если для некоторой схемы R кроме указанной функциональной зависимости существуют еще и другие, типа A  B, то, вообще говоря, схема отношения R будет характеризоваться некоторой избыточностью. Действительно, рассмотрим следующую схему отношения:

ПОСТАВЩИК (Номер поставщика, Имя, Город, Код города)

В этой схеме определена функциональная зависимость Город Код города. Следовательно, в каждом кортеже для каждого значения атрибута Город будет повторяться соответствующее значение атрибута Код города.

Чем это плохо?

Функциональные зависимости определяют некоторые ограничения целостности, которые должны проверяться при каждом обновлении состояния базы данных. Если таких ограничений много – слишком много времени будет тратиться на их проверку, что, конечно же, не очень хорошо. Например, если в некоторой реализации приведенного выше отношения ПОСТАВЩИК несколько десятков (или более) кортежей имеют одно и то же значение атрибута Город (например, Москва), и поменялся код этого города, необходимо внести изменения во все кортежи отношения.

Таким образом, функциональные зависимости рассматриваются как средство задания ограничений целостности для схемы отношения R, и они будут проверяться.

Вопрос: Как определить все функциональные зависимости? Можно ли, и как, определить минимальное количество функциональных зависимостей?

Замыкание множества функциональных зависимостей

Для каждой схемы отношения существует вполне определенное конечное множество функциональных зависимостей. Некоторые функциональные зависимости определяются проектировщиком из анализа семантики атрибутов. Из них могут быть выведены другие функциональные зависимости. Например, если существует некоторая схема отношения R(A,B,C) и для нее определены функциональные зависимости A  B и B  C, то интуитивно понятно, что существует и функциональная зависимость A  C.

Действительно, рассмотрим два кортежа u ∈ r и v ∈ r, где r – некоторая реализация отношения, удовлетворяющая схеме R. Пусть u[A] = v[A]. Что можно сказать о u[B] и v[B]? u[C] и v[C]? Если эти кортежи не совпадают по атрибуту B, т.е. для этих кортежей u[B] ≠ v[B], значит, нарушена функциональная зависимость A  B. Если же кортежи не совпадают по атрибуту C – u[C] ≠ v[C], тогда будет нарушена функциональная зависимость B  C.

Рассмотрим некоторые определения.