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

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

у меня есть пример проблемы:

найти все ключи отношения R (ABCDEFG) с функциональными зависимостями

AB → C
CD → E
EF → G
FG → E
DE → C
BC → A

продемонстрируйте свои знания, определив, какой из следующих является ключевым.

a. BCDEF             
b. ADFG           
c. BDFG           
d. BCDE 

может кто-нибудь провести меня через то, как я должен разложить функциональные зависимости сделать вывод, что некоторая комбинация атрибутов является ключом? Я ожидаю, что столкнусь с рядом таких проблем, и мне нужно понять, как к ним подойти.

7 ответов


возьмите FD, например AB→C

увеличивать, пока не будут упомянуты все атрибуты, например ABDEFG → CDEFG (обратите внимание, что это эквивалентно ABDEFG → ABCDEFG, потому что тривиально верно, что A->A и B->B).

Это говорит вам, что ABDEFG является суперключом.

проверьте другие FDs, в которых LHS является подмножеством вашего суперкея, и что на его RHS содержит какой-то другой атрибут вашего суперкея.

есть два. EF→G и FG→E. удалите атрибуты RHS этих от вашего superkey. Это дает вам два ключа, которые, безусловно, являются суперключевыми, но не обязательно неприводимыми: ABDEF и ABDFG.

однако из AB→C и CD→E мы также можем вывести, что ABD→E. следовательно, мы также можем удалить E из нашего ключа ABDEF. Неприятная вещь здесь заключается в том, что когда я сказал "проверить другие FDs", это, по-видимому, означает, что вы также должны проверить любой FD, который появляется в закрытии вашего набора FDs (т. е. любой FD, который выводится из вашего данного набора FDs)... И это немного непрактично делать вручную ...

полезный сайт для проверки правильности ваших результатов:

http://www.koffeinhaltig.com/fds/ueberdeckung.php

теперь вы сможете определить, что опция c является ключом.

обновление

ссылка теперь сломана, не знаю, где сайт пошел. Может быть, вы все еще можете найти что-то полезное на сайтах, которые отслеживают историю интернет.


Это видео объясняет очень хорошо

http://www.youtube.com/watch?v=s1DNVWKeQ_w


Ну это должно быть достаточно просто. Все, что вам нужно сделать, это принять закрытие каждый ключ дается и увидеть, если он содержит все атрибуты Р. например, закрытие BCDEF = ABCDEFG с БЦ -А и БЦ-это подмножество BCDEF и так, если ФВ для FD объектив EF -> г. Поскольку это замыкание содержит все атрибуты из R, BCDEF является ключевым. Основная цель закрытия-посмотреть, можем ли мы" достичь " каждого атрибута из заданного набора атрибутов. Закрытие-это набор атрибутов, которые мы можем на самом деле достичь путем перехода соб.


поскольку вы находитесь в курсе теории БД, я собираюсь предположить, что у вас есть опыт SQL и попытаться связать теорию с контекстом реализации.

в принципе, отношение-это то, что вы бы назвали таблицей в реализации, а ключ-это любой набор атрибутов (чтение столбцов), который можно использовать для идентификации уникальной строки (в теории БД это будет Кортеж). Самая простая аналогия здесь заключается в том, что ключ является вашим первичным ключом, а также любым другим возможным набором столбцов, которые вы можете использовать для определите один Кортеж в вашем отношении (строка в вашей таблице). Итак, вот основные шаги для этого (я пройду через пример A, а затем вы можете попробовать остальные):

  1. перечислите все атрибуты, которые не находятся в предлагаемом вами ключе (поэтому BCDEF не включает A и G).
  2. для каждого отсутствующего атрибута просмотрите список функциональных зависимостей и посмотрите, способен ли ваш предлагаемый ключ вывести атрибут, который вы недостающий.

                 a. So for A, you have BC -> A.  Since both B and C are in the proposed
                    key BCDEF, you can infer that BCDEF -> A.  Your set now becomes
                    BCDEFA.
                 b. For G, again going through your FDs you find EF -> G.  Since both
                    E and F are in BCDEFA, you can infer BCDEFA -> G.
    

поскольку вы смогли вывести как A, так и G из BCDEF, опция a является ключом отношения ABCDEFG. Я знаю, что для этого есть алгоритм, и он, вероятно, находится в вашем тексте курса где-то. Существует также, вероятно, пример. Вы должны пройти через него вручную, пока шаблон не станет интуитивно понятным.

EDIT: причина, по которой я бы вернулся через текст, чтобы искать этот алгоритм, заключается в том, что, скорее всего, ваш экзамен будет написан в отличие от множественного выбора, поскольку это курс теории БД. Если это правда, то вы получите более частичный кредит, если вы можете методично следовать нотации, продемонстрированные в тексте/заметках курса.

основная цель-превратить ключ в отношение, которое должно доказать, что предлагаемый ключ на самом деле является ключом.


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

в этом случае:

ни один из ваших FDs "не дает" вам B, D или F ... поскольку они являются частью отношения, не может быть супер ключа, который не содержит B, D и F ... удалить ответ b (B отсутствует)... удалить ответ d (F отсутствует)

теперь давайте проверим оставшиеся ответы, если они содержат достаточно информации, чтобы получить все части в отношении

ответ a (BCDEF) "даст" вам B, C, D, E и F, поэтому вам нужно найти A и G с помощью FDs ... A может быть достигнуто BC и G может быть достигнуто EF, поэтому ответ a является ключом

ответ c (BDFG) "даст" вам B, D, F и G, поэтому вам нужно найти A, C и E с помощью FDs ... E может быть достигнуто FG ... C может быть достигнуто DE (после достижения E FG) ... и, наконец, A может быть достигнуто BC (после достижения C) ...

поэтому ответ c-это своего рода ключ поскольку таким образом можно получить доступ ко всем отношениям ... но я не знаю, достаточно ли этого, чтобы соответствовать формальному определению ... если бы мне пришлось гадать, я бы сказал "Нет"!--1-->


код

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

https://github.com/lovasoa/find-candidate-keys/blob/master/find-candidate-keys.js

пример

candidate_keys(["A","B","C","D","E","F","G"], [ [['A','B'], 'C'], [['C','D'], 'E'], [['E','F'], 'G'], [['F','G'], 'E'], [['D','E'], 'C'], [['B','C'], 'A'] ]) возвращается [["B","D","F","G"],["B","D","E","F"],["B","C","D","F"],["A","B","D","F"]]


step1: since AB->C and CD->E.  then we get ABD->ABCDE(1)
step2: Given (1) and EF->G, then we get ABDF->ABCDEF, then ABDF->ABCDEFG(2), 

так ABDF-это супер ключ. Затем мы будем использовать результат depnedencies, чтобы определить, являются ли они ключами. (вот почему я использую БК-а, потому что это часть моей суперключ, который зависит от БК).

step3: Given (2) and BC->A, we get BCDF->ABDF, so BCDF->ABCDEFG(3)   
step4: Given (3) and DE->C, we get BDEF->BCDE, so BDEF->ABCDEFG(4)   
step5: Given (4) and FG->E, we get BDFG->BDEF, so BDFG->ABCDEFG,    
So the Answer BDFG is right.