BCNF / 3NF в реляционных базах данных - PullRequest
2 голосов
/ 16 октября 2011

Как определить, есть ли отношение R в BCNF и 3NF?

Я читаю учебник, и он говорит мне, что есть 3 основных атрибута, на которые вы смотрите, но мне трудно понять, что они говорят, или, по крайней мере, применять то, что они говорят, когда дают отношение и ФД.

3 атрибута: Учитывая отношение R с атрибутом A и X подмножество атрибутов R, для каждого FD X⟶A в F верно одно из следующих утверждений:

  • A ∈ X; то есть это тривиальный FD (означает «найден в X»)
  • X - суперключ
  • A является частью некоторого ключа для R

Два верхних соответствуют BCNF, а 3NF включают третий.

1 Ответ

4 голосов
/ 16 октября 2011

В книге SQL Antipatterns Билла Карвина есть хороший пример о BCNF и 3NF на стр. 303, который немного сложен, но я полагаю, что это отличие более кратко, чем любое описание различий, которые я имею.пока что читайте.

Например, предположим, что у нас есть три типа тегов: теги, которые описывают влияние ошибки, теги для подсистемы, на которую влияет ошибка, и теги, которые описывают исправление ошибки.Мы решили, что каждая ошибка должна содержать не более одного тега определенного типа.Ключ-кандидат может быть bug_id плюс tag, но также может быть bug_id плюс tag_type.Любая пара столбцов будет достаточно конкретной, чтобы адресовать каждую строку отдельно.

bug_id tag      tag_type
------------------------
1234   crash    impact
3456   printing subsystem
3456   crash    impact
5678   report   subsystem
5678   crash    impact
5678   data     fix

Затем книга преобразует эту единственную таблицу (которая удовлетворяет 3NF) в две таблицы, которые удовлетворяют BCNF:

bug_id tag
----------
1234   crash
3456   printing
3456   crash
5678   report
5678   crash
5678   data

tag       tag_type
------------------
crash     impact
printing  subsystem
report    subsystem
data      fix
...