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

учитывая следующие функциональные зависимости, как бы я вычислил минимальное покрытие:

A -> B, ABCD -> E, EF -> GH, ACDF -> EG

в лекционных заметках он дает вывод для минимального покрытия, но я его не понимаю.

например для избавления от ACDF - > E:

A -> B => AACD -> BACD -> E => ACD -> E => ACDF -> E

и тогда они говорят, что аналогично мы не держим ACDF - > G

и тогда я пойму, что ABCD - > E is вывод ACD - > E, потому что A - > B, но я не понимаю формального процесса, как добраться до этого.

Итак, мой вопрос: Может ли кто-нибудь объяснить, как создать минимальное покрытие для набора функциональных зависимостей?

2 ответов


чтобы получить минимальное покрытие, вы должны сделать два шага. Чтобы продемонстрировать, я сначала разделю зависимости на несколько (только один атрибут справа), чтобы сделать его более чистым:

A -> B
ABCD -> E
EF -> G
EF -> H
ACDF -> E
ACDF -> G

следующее должны выполняйте в этом порядке (#1, а затем #2), иначе вы можете получить неверный результат.

1) Избавьтесь от избыточных атрибутов (уменьшите левые стороны):

возьмите каждую левую сторону и попробуйте удалить по одному атрибуту затем попробуйте вывести правую сторону (которая теперь является только одним атрибутом для всех зависимостей). Если вам это удалось, вы можете удалить эту букву с левой стороны, а затем продолжить. Обратите внимание, что может быть несколько правильных результатов, это зависит от порядка, в котором вы делаете сокращение.

вы узнаете, что вы можете удалить B от зависимостей ABCD -> E, потому что ACD -> ABCD (используйте первый dep.) и от ABCD -> E. Вы можете использовать полный dep. в настоящее время вы сокращаете, сначала это иногда сбивает с толку, но если вы подумаете об этом, станет ясно, что вы можете это сделать.

аналогично, вы можете удалить F С ACDF -> E, потому что ACD -> ABCD -> ABCDE -> E (очевидно, вы можете вывести одну букву из самой буквы). После этого шага вы получаете:

A -> B
ACD -> E
EF -> G
EF -> H
ACD -> E
ACDF -> G

эти правила по-прежнему представляют одни и те же зависимости, что и оригинал. Обратите внимание, что теперь у нас есть повторяющееся правило ACD -> E. Если вы посмотрите на все это как на множество (в математическом смысле), то конечно вы не можете иметь один и тот же элемент дважды в одном наборе. Пока я просто оставляю его здесь дважды, потому что следующий шаг все равно избавится от него.

2) избавьтесь от избыточных зависимостей

теперь для каждого правила попробуйте удалить его и посмотрите, выводите ли вы то же самое правило, используя только другие. На этом этапе вы, конечно, не можете использовать dep. в настоящее время вы пытаетесь удалить (вы можете на предыдущем шаге).

если вы берете левую сторону первое правило A -> B, спрячьте его сейчас, вы видите, что вы ничего не можете вывести из . Поэтому это правило не является избыточным. Сделайте то же самое для всех остальных. Вы узнаете ,что вы можете (очевидно) удалить одно из повторяющихся правил ACD -> E, но строго говоря, вы можете использовать этот алгоритм. Скройте только одно из двух одинаковых правил, затем возьмите левую сторону (ACD), и используйте другой, чтобы вывести правую сторону. Поэтому вы можете удалить ACD -> E (только один раз курс.)

вы также увидите, что вы можете удалить ACDF -> G, потому что ACDF -> ACDFE -> G. Теперь результат:

A -> B
EF -> G
EF -> H
ACD -> E

который является минимальной крышкой исходного набора.


по моему мнению, в вышеуказанные функциональные минимальные зависимости ACDF - > G также должны быть включены, потому что при закрытии каждой буквы с левой стороны и их комбинации ни одна из них не производит G без включения F

Так было бы следующим образом:

(A - > B, EF - > G, EF - > H, ACD - > E, ACDF - > G )