Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 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 является ключом.

ОБНОВЛЕНИЕ

Ссылка

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

Ответ 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.