Операции реляционной алгебры. Нормальные формы. Связи между отношениями. Проектирование баз данных.

Операции реляционной алгебры

Реляционная теория так же определяет некоторые операции над отношениями. Перечислим основные операции реляционной алгебры:

Выборка

Возвращает отношение, содержащее все записи (кортежи) из заданного отношения, которые удовлетворяют указанным условиям.

\(\sigma_{a<10} R\) выбирает из отношения \(R\) записи, в которых атрибут \(a\) меньше \(10\).

Проекция

Возвращает отношение, содержащее все записи (кортежи) заданного отношения, которые остались в этом отношении после исключения из него некоторых атрибутов.

\(\pi_{a,b} R\) выбирает атрибуты \(a\), \(b\) из отношения \(R\).

Переименование

Возвращает отношение, содержащее все записи (кортежи) заданного отношения, при этом название одного атрибута заменяется на другое.

\(\rho_{a/b} R\) возвращает все записи отношения R, в которых атрибут \(a\) переименован в \(b\).

Произведение

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

\(R \times S\) возвращает отношение, в котором присутствуют все атрибуты отношений \(R\) и \(S\) во всех возможных комбинациях.

Объединение

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

\(R \cup S\)

Пересечение

Возвращает отношение, содержащее все кортежи, которые принадлежат одновременно двум заданным отношениям.

\(R \cap S\)

Разность

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

\(R - S\)

Соединение

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

\(R \bowtie S\)

θ-соединение

Возвращает отношение, содержащее все возможные кортежи, которые представляют собой комбинацию атрибутов двух кортежей, принадлежащих двум заданным отношениям, при условии θ.

\(R \bowtie_\theta S = \sigma_\theta (R \times S)\)

Деление

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

\(R \div S = \pi_{a_1,a_2,...,a_n} (R \cap (\pi_{a_1,a_2,...,a_n} R \times S))\)

\(a_i \in R, a_i \notin S\)

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

В дальнейшем, когда мы будем разбирать операторы языка SQL, мы попытаемся найти аналоги этих операций.

Нормальные формы

Для упрощения задач обработки данных, существуют так называемые нормальные формы реляционной модели. Они описывают, каким образом должна быть устроена структура БД, чтобы задачи поиска легко формализовывались. Обычно выделяют 6 основных нормальных форм, и две более строгих версии третьей и пятой нормальных форм. В практике проектирования СУБД обычно ограничиваются нормализацией до третьей или “строгой третьей”, поскольку, во-первых, дальнейшая нормализация не всегда осмыслена, во-вторых, усилия, необходимые для дальнейшей нормализации, как правило, значительно превышают результат.

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

Для нормализации используется операция, называемая декомпозицией.

1НФ

Отношение, соответствующая реляционной модели, автоматически находится в 1НФ.

Напомним требования реляционной модели:

  • Атрибуты имеют фиксированный тип данных (домен)
  • Атрибуты атомарны
  • Записи уникальны
  • Порядок записей не имеет значения (нет скрытых атрибутов)
  • Порядок атрибутов не имеет значения (нет скрытых зависимостей атрибутов)

2НФ

Для определения 2НФ, необходимо знание определение функциональной зависимости введенное в Лекции1

Введем понятие суперключа:

Суперключ
это такое множество атрибутов \(A\), которое удовлетворяет требованию уникальности, то есть не существует записей с повторяющимися значениями \(A\).

Важно отметить, что для отношения с атрибутами \((A_1, A_2, \ldots, A_n)\) существует по крайней мере один суперключ \((A_1, A_2, \ldots, A_n)\), т.е. включающий все атрибуты. Это прямо следует из требования уникальности записей в отношении.

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

Более строгое определение потенциального ключа:

Потенциальный ключ
это такое множество атрибутов \(A\), которое удовлетворяет требованиям уникальности и минимальности, то есть не существует записей с повторяющимися значениями \(A\) (уникальность) и не существует такого строгого подмножества \(B\subsetneq A\), которое бы удовлетворяло требованию уникальности (минимальность).

Так же введем определения ключевых и неключевых атрибутов:

Ключевые атрибуты
это атрибуты, которые входят в какой-либо потенциальный ключ
Неключевые атрибуты
это атрибуты, которые не входят ни в один потенциальный ключ

Отношение находится во 2НФ, если

  • Оно находится в 1НФ
  • Неключевые поля функционально зависят от (какого-либо) потенциального ключа

3НФ

Транзитивная зависимость
множество атрибутов \(C\) транзитивно зависит от множества атрибутов \(A\), если существует такое множество атрибутов \(B\), что \(A\rightarrow B\) и \(B\rightarrow C\), причем \(\require{cancel} B \cancel{\rightarrow} A\).

Отношение находится в 3НФ, если

  • Оно находится во 2НФ
  • Отсутствуют транзитивные зависимости неключевых атрибутов от потенциального ключа. Иначе, отсутствуют функциональные зависимости неключевых атрибутов от неключевых атрибутов.

Определение Кента: каждый неключевой атрибут “должен предоставлять информацию о ключе, полном ключе и ни о чём, кроме ключа”.

Определение Заниоло:

Отношение находится в 3НФ тогда и только тогда, когда для каждой его функциональной зависимости \(X\rightarrow A\) выполняется хотя бы одно из условий:

  • \(A\subset X\)
  • \(X\) является суперключом
  • \(A\) – ключевой атрибут (т.е. входит в состав потенциального ключа)

Нормальная форма Бойса-Кодда (НФБК)

Отношение находится в НФБК (усиленной 3НФ), если

  • Оно находится в 3НФ
  • Отсутствуют функциональные зависимости между подмножествами ключевых атрибутов различных потенциальных ключей

Формально: Отношение находится в НФБК тогда и только тогда, когда детерминантом (левой частю) любой его функциональной зависимости, входящей в (какое-либо) минимальное покрытие ФЗ этого отношения, является потенциальный ключ.

Определение Дэйта: “Каждый атрибут должен предоставлять информацию о ключе, полном ключе и ни о чём, кроме ключа”.

Определение Заниоло:

Отношение находится в 3НФ тогда и только тогда, когда для каждой его функциональной зависимости \(X\rightarrow A\) выполняется хотя бы одно из условий:

  • \(A\subset X\)
  • \(X\) является суперключом.

Нормальная форма элементарного ключа (НФЭК)

НФЭК предложена Карло Занионо в 1982 году в качестве “компромисса” между 3НФ и НФБК.

Элементарная ФЗ
Функциональная зависимость \(f \in G\), \(f = X\to A\) называется элементарной, если она нетривиальна и замыкание \(G^+\) не содержит ФЗ \(X'\to A\) такого, что \(X' \subset X\).
Элементарный ключ
Суперключ \(X\) отношения \(R\) называется элементарным ключом, если \(R\) удовлетворяет элементарной ФЗ \(X\to A\), где \(A\) – некий атрибут \(R\).

Отношение находится в НФЭК, если

  • Оно находится в 3НФ
  • Любая его элементарная ФЗ имеет в левой части суперключ или в правой части находится подмножество какого-либо элементарного ключа.

Иначе, отношение находится в НФЭК, если для любой его ФЗ \(X\to A\) выполняется хотя бы одно из условий:

  • \(A\subset X\)
  • \(X\) является суперключом.
  • A входит в состав элементарного ключа

Декомпозиция без потерь

Как было сказано ранее, получить более высокую нормальную форму можно при помощи декомпозиции отношений.

Декомпозиция
Составление проекций \(S\), \(T\) исходного отношения \(R\), таких, что объединение заголовков \(S\) и \(T\) совпадает с заголовком \(R\).

Однако, не всякая декомпозиция допустима.

Выделяют два типа декомпозиции, используемой для нормализации.

Декомпозиция без потерь
Такая декомпозиция \(R\) в \((S,T)\), что \(R = S\bowtie T\).

Декомпозиция без потерь (lossless-join) позволяет восстановить исходное отношение при помощи операции соединения.

Как выбрать декомпозиции без потерь из всех возможных? Ответ на этот вопрос дает теорема Хита.

Теорема Хита
Пусть дано отношение \(R(A,B,C)\). Если \(R\) удовлетворяет функциональной зависимости \(A\to B\) , то \(R = \pi_{A,B} R \bowtie \pi_{A,C} R\).

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

Например, пусть дано отношение \(R(A,B,C)\), удовлетворяющее ФЗ \(F_R=\{(A,B)\to C,C\to A\}\). По теореме Хита, \(C\to A \Rightarrow R=S(B,C)\bowtie T(C,A)\). Тогда ФЗ отношения \(S\) \(F_S=\{B\to B, C\to C\}^+\), и ФЗ отношения \(T\) \(F_T=\{C\to A\}^+\). Но \(((A,B)→C)\notin (F_S\cup F_T)^+\), и в результате оказывается потеряна.

Всегда существует декомпозиция без потерь до НФБК.

Декомпозиция, сохраняющая зависимости
Такая декомпозиция \(R\) в \((S,T)\), что замыкание множества ФЗ отношения \(R\) совпадает с замыканием объединения ФЗ отношений \(S\) и \(T\).

Декомпозиция, сохраняющая зависимости (dependency-preserving) сохраняет неизменным замыкание ФЗ всех отношений БД.

Всегда существует декомпозиция до НФЭК, сохраняющая зависимости. Однако, не всегда возможна декомпозиция, сохраняющая зависимости, до НФБК.

Проецирование функциональных зависимостей

Декомпозиция отношений по сути осуществляется при помощи операции проекции. При этом, мы утверждаем, что функциональные зависимости при декомпозиции сохраняются. Возникает вопрос: каким образом функциональные зависимости ведут себя при проецировании отношений?

Предположим, что имеется исходное отношение \(R\) с множеством ФЗ \(F\), и пусть \(S\) – некая проекция отношения \(R\): \[ S = \pi_A R, \] где A – некое множество атрибутов.

Тогда, множество \(G\) ФЗ, которые останутся в \(S\), это ФЗ, которые:

  1. Следуют из \(F\)
  2. Включают только атрибуты, принадлежащие \(A\)

Вполне вероятно, что множество всех ФЗ такого рода избыточно (не минимально). Сложность алгоритма поиска ФЗ отношения \(S\) в худшем случае экспоненциально зависит от количества атрибутов в \(A\).

Для нахождения всех ФЗ можно применять замыкание атрибутов из \(A\) по \(F\). Следует сделать два достаточно очевидных замечания:

  • Замыкания пустого множества и множества всех атрибутов не приводят к получению нетривиальных ФЗ
  • Если \(A \subset X^+\), то построение замыканий для надмножеств \(X\) не даст новых нетривиальных ФЗ в силу правила дополнения.

Так же понятно, что для любого замыкания \(X^+\), существуют ФЗ вида \(X \to B\), где \(B \subset X^+\).

Таким образом, мы можем начать с построения замыканий для единичных множеств атрибутов, и добавить все следующие из них ФЗ к множеству ФЗ \(G\), если они содержат только атрибуты из \(A\), а затем, при необходимости, построить замыкания для множеств атрибутов большей размерности.

Пример:

Пусть отношение \(R(A,B,C,D)\) имеет следующие ФЗ:

  • \(A \to B\)
  • \(B \to C\)
  • \(C \to D\)

Пусть теперь мы получаем проекцию \(S = \pi_{A,C,D} R\). Найдем ФЗ \(G\) отношения \(S\).

Для этого, построим замыкания для всех атрибутов отношения \(S\) по \(F\). Поскольку \(B\) не входит в отношение \(S\), его замыкание не даст нам ФЗ, входящих в \(G\). \[ {A}^+ = {A,B,C,D} \] \[ {C}^+ = {C,D}\] \[ {D}^+ = {D}\]

Можем заметить, что \({A,C,D} \subset {A}^+\), соответственно, рассмотрение надмножеств \({A}\) не имеет смысла. Следовательно, единственное неединичное множество атрибутов, требующее рассмотрения это \[ {C,D}^+ = {C,D} .\]

Запишем множество нетривиальных ФЗ \(S\), получающиеся из этих замыканий: \[A \to C\] \[A \to D\] \[C \to D\]

Теперь найдем минимальное множество ФЗ. По правилу транзитивности, ФЗ \(A \to D\) следует из двух других, поэтому его можно исключить. В итоге, получаем минимальное множество ФЗ \(S\): \[A \to C\] \[C \to D\]

Алгоритм Бернштейна построения схемы БД в НФЭК по множеству ФЗ

Филип Бернштейн предложил алгоритм построения схемы в 3НФ по ФЗ в 1976 г. Позже, Заниоло показал, что схема, построенная по этому алгоритму так же находится в НФЭК.

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

Алгоритм может быть описан следующим образом:

Пусть дано множество \(F\) нетривиальных ФЗ. Тогда:

  1. Удалить избыточные атрибуты в детерминантах (левых частях) каждой ФЗ. Получить множество ФЗ \(G\).
  2. Построить неизбыточное покрытие \(H\) для \(G\) (минимизировать \(G\))
  3. Разбить \(H\) на группы таким образом, чтобы левые части ФЗ в каждой группе имели одинаковые левые части.
  4. Объединить эквивалентные ключи. Для каждых двух групп \(H_i\) и \(H_j\), имеющих левыми частями соответственно \(X_i\) и \(X_j\), объединить их, если в \(H^+\) существуют ФЗ \(X_i \to X_j\) и \(X_j \to X_i\).
  5. Составить отношения. Для каждой группы, составить отношение, содержащее атрибуты этой группы. Ключом каждого отношения будут атрибуты детерминанта группы.

Избыточным атрибутом в детерминанте ФЗ \(g \in G\), \(g = X_1, \ldots, X_p \to Y\), является атрибут \(X_i\), если \(G^+\) содержит ФЗ \(X_1, \ldots,X_{i-1}, X_{i+1}, \ldots, X_p \to Y\).

Иначе, для ФЗ \((A \to B) \in G\), атрибут \(a\in A\) является избыточным, если \(a\in (A-\{a\})^+_ G\).

Виды связей между отношениями

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

Внешний ключ
Набор атрибутов \(A\) отношения \(R\) называется внешним ключом, если тот же набор атрибутов \(A\), либо некое переименование \(\rho_B A\), является суперключом некого другого отношения \(S\), причем множество значений \(A\) по всем записям \(R\) в любой момент времени является подмножеством значений \(\rho_B A\) по всем записям \(S\).

Выделяется четыре типа связей:

Один к одному (1:1)

Каждой записи отношения \(R\) соответствует одна и только одна запись отношения \(S\), и наоборот.

Нередко оказывается, что отношения \(R\) и \(S\) можно объединить без каких-либо потерь. В таких случаях, единственной причиной сохранять два отношения может быть связь этих отношений с различными сущностями.

Один ко многим (1:M)
Каждой записи отношения \(R\) соответствует \(M \geq 0\) записей отношения \(S\), но каждой записи отношения \(S\) соответствует только одна запись отношения \(R\).
Многие к одному (M:1)
Каждой записи отношения \(R\) соответствует только одна запись отношения \(S\), но каждой записи отношения \(S\) соответствует \(M \geq 0\) записей отношения \(R\)
Многие ко многим (M:N)
Каждой записи отношения \(R\) соответствует \(M \geq 0\) записей отношения \(S\), и каждой записи отношения \(S\) соответствует \(N \geq 0\) записей отношения \(R\)

Связи так же делятся на идентифицирующие и не идентифицирующие.

Идентифицирующая связь

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

Например, даны отношения Directory = (Id, Name) и File = (Id, Name, DirectoryId), связанные 1:М через внешний ключ File.DirectoryId ⇆ Directory.Id. В данной модели, файл не может существовать без директории, и эта связь является идентифицирующей, поскольку требует существования значения Directory.Id, равного File.DirectoryId.

Не идентифицирующая связь

связь, не являющаяся идентифицирующей.

Например, даны два отношения Account = (Id, Type) и AccountType = (Type, Description), связанные M:1 через внешний ключ Account.Type ⇆ AccountType.Type. В данной модели Type может быть не задан. Такое отношение не будет идентифицирующим, поскольку записи в Account и AccountType могут существовать независимо друг от друга.

Проектирование баз данных

Проектирование баз данных – это процесс концептуализации и реализации базы данных, описывающих некую предметную область, для встраивания в конкретную СУБД.

Обычно выделяют следующие этапы проектирования БД:

  1. Концептуальное (инфологическое) проектирование.
  2. Логическое (даталогическое) проектирование
  3. Физическое проектирование

Рассмотрим эти этапы более подробно.

Инфологическое проектирование

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

Такие модели, как правило, строятся без ориентации на конкретную СУБД или даже модель данных. Смысл построения инфологической модели заключается в выделении основных сущностей предметной области и их свойств (атрибутов).

Один из популярных способов построения инфологической модели – построение ER-диаграмм.

ER-диаграммы

В отличие от диаграмм атрибутов, ER-диаграммы, кроме непосредственно атрибутов, включают так же в явном виде “сущности” и “связи” между ними, откуда, собственно, и происходит название: entity-relationship diagram, или диаграмма сущности-связи.

И сущности, и связи могут обладать набором атрибутов. Сущности без атрибутов – явление достаточно бессмысленное, как Кантовская “вещь в себе”. Связи без атрибутов – явление, напротив, весьмя распространенное.

Строго говоря, на диаграмме обозначаются классы сущностей. Во избежание путаницы, под словом “сущность” будем понимать набор атрибутов, а набор значений этих атрибутов будем называть экземпляром сущности.

В наиболее распространенной нотации, атрибуты обозначаются овалами, сущности – прямоугольниками, а связи – ромбами.

Сущности и связи соединяются между собой линиями. Существуют различные нотации, подразумевающие различную степень подробности описания. Мы будем использовать упрощенную схему, в которой для каждой линии надписывается, как раз сущность участвует в связи: 1 или много раз (М). В связи могут участвовать две или более сущностей. Хотя многозначные связи (связи, в которых участвуют более двух сущностей) – не слишком распространенное явление, иногда они бывают необходимы.

Для каждой сущности могут быть выделены один или несколько идентифицирующих атрибутов, так же, по аналогии с реляционной моделью, называемых ключом. Значения ключа сущности однозначно идентифицируют экземпляр сущности, так же как значение потенциального ключа отношения однозначно идентифицирует запись. Понятно, что ключей может быть несколько – по крайней мере один ключ, включающий все атрибуты сущности, должен существовать – назовем его тривиальным. Кроме того, возможно существуют ключи-подмножества тривиального. Условимся, что из всех ключей мы выбираем один минимальный, и используем его (назовем его первичным).

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

Рассмотрим ER-диаграмму для примера с теннисными кортами.

Логическое (даталогическое) проектирование

Логическое проектирование
создание схемы базы данных на основе конкретной модели данных, например, реляционной модели данных. Для реляционной модели данных даталогическая модель — набор схем отношений, обычно с указанием первичных ключей, а также «связей» между отношениями, представляющих собой внешние ключи.

На этапе логического проектирования учитывается специфика конкретной модели данных, но может не учитываться специфика конкретной СУБД.

Переход от ER-диаграмм к ФЗ

ER-диаграммы вполне естественным образом могут быть преобразованы к ФЗ.

Каждая сущность подразумевает ФЗ неключевых атрибутов от ключевых, поскольку значения ключевых атрибутов однозначно определяют значения остальных – иначе, значения неключевых атрибутов есть (вообще говоря, дискретная) функция от значений ключевых атрибутов.

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

Связи двух сущностей типа один-ко-многим и многие-к-одному естественным образом моделируют функциональную зависимость между ключевыми атрибутами соответствующих сущностей: в левой части ФЗ находятся ключевые атрибуты сущности, входящей в связь многократно, а в правой – ключевые атрибуты сущности, входящей в связь однократно, а так же атрибуты самой связи (если есть). Можно сказать, что ФЗ моделирует связь типа многие-к-одному.

Это же рассуждение естественным образом обобщается на многозначные связи: каждая из однократно входящих в связь сущностей (точнее, ее ключи) функционально зависят от всех многократно входящих в связь сущностей. То же самое можно сказать об атрибутах самой связи.

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

Таким образом:

  1. Каждая сущность \(E\) преобразуется к ФЗ вида \[ K_E \to A_E, \] где \(K_E\) – множество ключевых (идентифицирующих) атрибутов сущности \(E\), а \(A_E\) – множество всех атрибутов сущности \(E\).
  2. Каждая связь \(R\) между сущностями \(E_1,\ldots,E_n\), входящими в связь многократно и \(S_1,\ldots,S_m\), входящими в связь однократно, преобразуется к ФЗ вида \[ K_{E1} \cup \ldots \cup K_{En} \to A_R \cup K_{S1} \cup \ldots \cup K_{Sn},\] где \(K_i\) – ключи соответствующих сущностей, \(A_R\) – атрибуты связи, и ФЗ вида \[K_{Si} \to K_{S1} \cup \ldots \cup K_{Sn}\].

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

Диаграммы атрибутов

Кроме непосредственной записи ФЗ в столбик, существует более наглядный способ представления ФЗ отношений. Он так же может использоваться для нормализации отношения по крайней мере до 3НФ.

Диаграммы атрибутов строятся следующим образом. В овалах записываются все атрибуты данной предметной области, и между ними рисуются стрелки, соответствующие ФЗ, присутствующим в системе. В случае наличия составных левых частей ФЗ, вводятся промежуточные узлы, обозначаемые точкой.

Например, построим диаграмму атрибутов для нашего примера с теннисными кортами.

Использование диаграмм атрибутов позволяет достаточно просто обнаруживать транзитивные зависимости и выделять отдельные отношения методом простой группировки связанных узлов (атрибутов).

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

Теперь для каждого ключевого атрибута выделим его и все атрибуты, непосредственно зависящие от него, в отдельную группу.

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

Двойной линией обозначены внешние ключи.

Несложно заметить, что каждая из выделенных групп является отношением в 3НФ.

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

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