04. Теория проектирования реляционных баз данных. Функциональные зависимости - KattyOG/Database GitHub Wiki

Теория проектирования реляционных баз данных

При проектировании базы данных решаются две основные проблемы:

  • Каким образом отобразить объекты предметной области в абстрактные объекты модели данных, чтобы это отображение не противоречило семантике предметной области, и было, по возможности, лучшим (эффективным, удобным и т. д.)?
    (проблема логического проектирования баз данных)
  • Как обеспечить эффективность и корректность выполнения запросов к базе данных?
    (проблема физического проектирования баз данных)

Физическое проектирование

Отвечает на вопросы: что неплохо сделать, чтобы ваши запросы к базе работали хорошо и правильно.

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

Из лекции от 30.10 понятными словами:
Фактически нормализация связана с разбиением: как из одной большой сущности широкой, на много полей сделать несколько маленьких сущностей, которые будут хранить данные без дублирования. Это позволит сэкономить пространство

Обычно выделяется следующая последовательность нормальных форм:

  • первая нормальная форма
  • вторая нормальная форма
  • третья нормальная форма
  • нормальная форма Бойса-Кодда
  • четвертая нормальная форма
  • пятая нормальная форма, или нормальная форма проекции-соединения

Основные свойства нормальных форм:

  • каждая следующая нормальная форма в некотором смысле лучше предыдущей
  • при переходе к следующей нормальной форме свойства предыдущих нормальных свойств сохраняются

Процесс проектирования реляционной базы данных на основе метода нормализации преследует две основные цели:

  • избежать избыточности хранения данных
  • устранить/избежать аномалии

Аномалии бывают трех видов:

  • Обновления
  • Удаления
  • Вставки

Из лекции от 30.10 понятными словами:
Аномалия обновления заключается в обновлении сущности в цикле, например, когда у нас нет бизнес-ключа. Тогда при update-е сущности, может получиться ситуация, что несколько записей в таблице с одинаковым id будут отличаться.
Решение: юзать транзакции: "всё или ничего"

Аномалия удаления заключается в том, что удаление одной строки влечет удаление другой сущности.
Решение: использовать еще одну таблицу.

Аномалия вставки заключается в том, что вставка в одну сущность влечет вставку в другую сущность. Обычно это значение null/null.


Про OLAP и OLTP

OLAP - online analytical processing - системы оперативной аналитической обработки
OLTP - online transaction processing - системы оперативной обработки транзакций

Из лекции от 30.10 понятными словами:
OLTP нацелена на сохранение и накопление данных, транзакции.
OLAP нацелена на упрощение запросов для пользователей.

Особенности OLTP: быстрая вставка, быстрый update, delete. Время select-a увеличивается из-за большого количества таблиц, большого количества join-ов (3-я нормальная форма)

Особенности OLAP: время select-а сведено к минимуму, но эта система денормализованная.
Чтобы построить денормализованную систему, ее нужно сначала нормализовать

Функциональные зависимости

Рассмотрим таблицу:

Определение 1:

Пусть R - это отношение, а Х и Y - произвольные подмножества множества атрибутов отношения R. Тогда Y функционально зависимо от Х, что в символическом виде записывается как X -> Y, значит значение множества Х связано в точности с одним значением множества Y.

Из таблицы видим, что
{ Sno } -> { City } // Город функционально зависит от поставщика
{ Sno } - это детерминант, { City } - это зависимая часть

{ Sno, Рno } -> { Qty }
{ Sno, Рno } -> { City }
{ Sno, Рno } -> { City, Qty }
{ Sno, Рno } -> { Sno }
{ Sno, Рno } -> { Sno, Рno, City, Qty }
{ Sno } -> { Qty }
{ Qty } -> { Sno }

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

Определение 2:

ФЗ называется тривиальной, только когда y ∈ x, то есть:
{ Sno, Рno } -> { Sno }

Правила Армстронга:

  1. Правило рефлексивности: B ∈ A => A -> B
  2. Правило дополнения: (A -> B) => АС -> BC
  3. Правило транзитивности: (А -> В), (В -> С) => (А -> C)

Расширяющие правила:

  1. Правило самоопределения: A -> A
  2. Правило декомпозиции: A -> BC => А -> B, A-> C
  3. Правило объединения: А -> B, A-> C => A -> BC
  4. Правило композиции: А -> B, C-> D => AC -> BD

Общая теорема объединения:

(А -> В) и (С -> D) => (А (С – B) -> BD)

Суперключ и его друзья

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

Из этого определения следует, что суперключи для данной переменной-отношения R - это такие подмножества К множества атрибутов переменной-отношения R, что ФЗ (K -> A) истинна для каждого атрибута А переменной-отношения R.
Любой потенциальный ключ есть суперключ, но это не работает наоборот

Потенциальный ключ К - это суперключ с дополнительным свойством: удаление любого атрибута из K приведет к тому, что K перестанет быть суперключом.

Определение 3

Дано 2 множества ФЗ. S1 и S2 эквивалентны, только когда они являются покрытиями друг друга.

Определение 4:

Множество ФЗ является неприводимым, когда:

  1. Для каждой ФЗ X->Y, Y - один элемент
  2. Ни одна ФЗ не мб устранена без изменения замыкания
  3. Ни один элемент/атрибут не может быть удален из детерминанта без изменения замыкания

Определение 5:

Суперключ в схеме отношения R(A1, A2, ... , An) - это набор атрибутов S из R со свойством, что ни для каких двух кортежей t1 и t2 в любом отношении над схемой R не будет выполняться равенство t1[S] = t2[S].

Определение 6:

Атрибут в схеме отношения R называется первичным атрибутом R, если он является членом некоторого потенциального ключа R. Атрибут называется непервичным, если он не является первичным атрибутом, то есть, если он не является членом какого-либо потенциального ключа.

⚠️ **GitHub.com Fallback** ⚠️