Определение ключей от функциональных зависимостей
Я беру курс теории базы данных, и мне не ясно, после чтения, как я могу вывести ключи, учитывая набор функциональных зависимостей.
У меня есть пример проблемы:
Найти все ключи отношения R (ABCDEFG) с функциональными зависимостями
AB → C
CD → E
EF → G
FG → E
DE → C
BC → A
Продемонстрируйте свои знания, указав, какой из следующих является ключом.
a. BCDEF
b. ADFG
c. BDFG
d. BCDE
Может ли кто-нибудь пройти через меня, как я должен разложить функциональные зависимости, чтобы заключить, что некоторая комбинация атрибутов является ключом? Я ожидаю, что столкнусь с рядом этих проблем, и мне нужно понять, как подойти к нему.
Ответы
Ответ 1
Возьмите FD, например. АВ → С
Увеличение до тех пор, пока не будут упомянуты все атрибуты, например. ABDEFG → CDEFG (заметим, что это эквивалентно ABDEFG → ABCDEFG, потому что тривиально верно, что A- > A и B- > B).
Это говорит о том, что ABDEFG является суперключем.
Проверьте другие FD, в которых LHS является подмножеством вашего суперкласса, и что на его RHS содержится еще один атрибут вашего супер-ключа.
Есть два. EF → G и FG → E. Удалите атрибуты RHS из них с вашего суперкласса. Это дает вам два ключа, которые, безусловно, являются супер-ключами, но не обязательно неприводимыми: ABDEF и ABDFG.
Однако из AB → C и CD → E мы также можем получить, что ABD → E. Следовательно, мы также можем удалить E из нашего ключа ABDEF. Отвратительная вещь здесь заключается в том, что когда я сказал "Проверить другие FD", это, по-видимому, означает, что вы также должны проверить любой FD, который появляется при закрытии вашего набора FD (то есть любого FD, который выводится из вашего данного набора FD)... И это немного непрактично делать вручную...
Полезный сайт для проверки правильности результатов:
http://www.koffeinhaltig.com/fds/ueberdeckung.php
Теперь вы должны определить, что опция c является ключом.
ОБНОВЛЕНИЕ
Ссылка теперь сломана, не знаю, куда ушел сайт. Возможно, вы все еще можете найти что-то полезное на сайтах, которые отслеживают историю Интернета.
Ответ 2
Это видео очень хорошо объясняет
http://www.youtube.com/watch?v=s1DNVWKeQ_w
Ответ 3
Ну, это должно быть довольно просто. Все, что вам нужно сделать, это сделать закрытие каждого указанного ключа и посмотреть, содержит ли он все атрибуты R. Например, закрытие BCDEF = ABCDEFG, так как BC → A и BC - подмножество BCDEF, и поэтому, если EF для FD EF → G. Так как это замыкание содержит все атрибуты R, ключ BCDEF. Основная цель принятия закрытий - увидеть, можем ли мы "достичь" каждого атрибута из заданного набора атрибутов. Закрытие - это набор атрибутов, которые мы можем реально достичь путем навигации по FD.
Ответ 4
Поскольку вы находитесь в курсе теории db, я собираюсь предположить, что у вас есть опыт SQL, и попытайтесь связать теорию с контекстом реализации.
В принципе, отношение - это то, что вы бы назвали таблицей в реализации, а ключ - ЛЮБОЙ набор атрибутов (чтение столбцов), которые можно использовать для идентификации UNIQUE строки (в теории db это будет кортеж). Простейшая аналогия здесь заключается в том, что ключ - это ваш первичный ключ, а также любой другой возможный набор столбцов, которые вы можете использовать для идентификации одного кортежа в вашем отношении (строка в вашей таблице). Итак, вот основные шаги для этого (я пройду через пример A, а затем вы можете попробовать остальные):
- Перечислите все атрибуты, которые НЕ находятся в предложенном вами ключе (поэтому BCDEF не включает A и G).
-
Для каждого атрибута, который вам не хватает, просмотрите список функциональных зависимостей и посмотрите, может ли предложенный вами ключ выводить атрибут, который вам не хватает.
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: Причина, по которой я вернусь к тексту, чтобы найти этот алгоритм, заключается в том, что ваши экзамены будут написаны в отличие от множественного выбора, поскольку это курс теории дБ. Если это так, вы получите более частичный кредит, если вы можете методично следовать за нотами, указанными в тексте курса/заметках.
Основная цель - превратить ключ в отношение, которое должно доказать, что предлагаемый ключ на самом деле является ключевым.
Ответ 5
ну, я не эксперт по этому поводу, поэтому исправьте меня, если я ошибаюсь, но мой подход был бы для устранения невозможных ответов
в этом случае:
ни один из ваших FD "не дает" вам B, D или F..., поскольку они являются частью отношения, не может быть супер ключа, который не содержит B, D и F... удалить ответ b (B есть отсутствует)... удалить ответ d (F отсутствует)
теперь можно проверить оставшиеся ответы, если они содержат достаточно информации, чтобы получить все части отношения
answer a (BCDEF) будет "давать" вам B, C, D, E и F, поэтому вам нужно найти A и G, используя FD... A может быть достигнуто BC и G может быть достигнуто EF, поэтому ответ a - это ключ
answer c (BDFG) будет "давать" вам B, D, F и G, поэтому вам нужно найти A, C и E, используя FDs... E может быть достигнуто FG... C может быть достигнуто DE (после достижения E по FG)... и, наконец, A может быть достигнуто BC (после достижения C)...
так что ответ c - это какой-то ключ, так как все отношение можно получить таким образом... но я не знаю, достаточно ли этого, чтобы соответствовать формальному определению... если бы мне нужно было догадаться, я 'd say no
Ответ 6
Код
Если код говорит вам больше, чем длинные объяснения, вот реализация 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"]]
Ответ 7
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, чтобы определить, являются ли они ключами. (вот почему я использую BC- > A, потому что A является частью моей суперключи, которая зависит от BC).
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.