View on GitHub

ITMO-PE

My study notes about Program Engineering at University ITMO

MainPage/Algorithm&DataStructures/Lecture 3

Лекция 3: нормализация

Реляционное представление

Реляционная БД

Э. Кодд: любое представление данных можно свести к совокупности отношений.

Домены

Основные правила

Базовые понятия

Пример

ID Surname Name Birthday Location
1 Иванов Василий 1980-12-01 г. Москва
2 Георгиев Сергей 1992-03-12 г. Санкт-Петербург
3 Васильев Андрей 1987-10-14 г. Оренбург
7 Романов Кирилл 1991-12-01 NULL

Терминология

Операции реляц. алгебры

Реляционная алгебра — язык для определения новых отношений на основе существующих.

В реляционной алгебре определен ряд операций над отношениями.

Результат операции — новое отношение.

В операциях будут использоваться обозначения:

Операция выборки

$\sigma_\varphi(R)$ — операция выборки — в результате операции формируется отношение на основе $R$, которое содержит только те строки (кортежи), которые удовлетворяют заданному предикату.

SELECT * FROM STUDENTS WHERE
STUDENTS.GROUP = '3100' AND
STUDENTS.ID >= 150000;
\[\Downarrow\] \[\sigma_{(STUDENTS.GROUP='3100')\land(STUDENTS.ID>=150000)}(STUDENTS)\]

Проекция

$\pi_{attr}(R)$ — проекция — в результате операции формируется новое отношение, содержащее только те атрибуты из $R$, которые были указаны в проекции:

SELECT name, group FROM STUDENTS;
\[\Downarrow\] \[\pi_{name, group}(STUDENTS)\]

Соединение

$R \bowtie_\theta S$ — соединение (тета-соединение)

\[R\bowtie_\theta S=\sigma_\theta(R\times S)\]
SELECT * FROM STUDENTS
JOIN EXAMS ON STUDENTS.ID = EXAMS.STUD_ID;
\[\Downarrow\] \[STUDENTS \bowtie_{STUDENTS.ID=EXAMS.STUD\_ID} EXAMS\]

Законы

Пример

SELECT * FROM STUDENTS
JOIN EXAMS ON STUDENTS.ID = EXAMS.STUD_ID
WHERE
    STUDENTS.GROUP = '3100' AND 
    STUDENTS.ID >= 150000;
\[\Downarrow\] \[\sigma_{STUDENTS.GROUP = '3100'\land STUDENTS.ID >= 150000} (STUDENTS \bowtie_{STUDENTS.ID=EXAMS.STUD_ID} EXAMS)\]

Сокращенная запись

SELECT * FROM STUDENTS
JOIN EXAMS ON STUDENTS.ID = EXAMS.STUD_ID 
WHERE
    STUDENTS.GROUP = '3100' AND 
    STUDENTS.ID >= 150000;
\[\Downarrow\] \[\sigma_{STUDENTS.GROUP\land STUDENTS.ID} (STUDENTS \bowtie_{STUDENTS.ID=EXAMS.STUD_ID} EXAMS)\]

План выполнения запроса

Эквивалентные планы

Нормализация

Вопросы к полученной модели:

Нормализация - формальный метод для проверки/доработки модели на основе ключей и функциональных зависимостей в отношениях.

Аномалии вставки

INSERT INTO STUDENTS
    VALUES(57, 'Nina Simonova', 'P3100', 'E. Kirov');
INSERT INTO STUDENTS
    VALUES(58, 'Petr Uvarov', 'P3100', 'Egor Lomov');

STUDENTS

StudID StudName Group GrMentor
1 Ivan Petrov P3100 Egor Kirov
3 Vasily Ivanov P3101 Roman Ivov
34 Gleb Anisimov P3100 Egor Kirov
57 Nina Simonova P3100 E.Kirov
58 Petr Uvarov P3100 Egor Lomov
UPDATE STUDENTS
    SET GrMentor = 'Eugene Lomov'
    WHERE StudName = 'Ivan Petrov';

STUTENDS

StudID StudName Group GrMentor
1 Ivan Petrov P3100 Egor Kirov
3 Vasily Ivanov P3101 Roman Ivov
34 Gleb Anisimov P3100 Egor Kirov

Аномалии удаления

DELETE FROM STUDENTS
    WHERE StudName = 'Vasily Ivanov';
StudID StudName Group GrMentor
1 Ivan Petrov P3100 Egor Kirov
3 Vasily Ivanov P3101 Roman Ivov
34 Gleb Anisimov P3100 Egor Kirov

Данных о группе Р3101 больше нет.

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

Функциональная зависимость — средство для описания связей между атрибутами отношения.

$R$ — отношение $A_1, A_2$ — атрибуты $R$

Если в $R$ атрибут $A_2$ функционально зависит от атрибута $A_1$, то каждое значение $A_1$ связано с одним значением $A_2$ и определяет его.

$A_1 \rightarrow A_2$ $A_1$ — детерминант функциональной зависимости. $A_1$ и $A_2$ могут представлять несколько атрибутов.

Пример

STUDENTS

StudID StudName Group GrMentor
1 Ivan Petrov P3100 Egor Kirov
3 Vasily Ivanov P3101 Roman Ivov
34 Gleb Anisimov P3100 Egor Kirov

STUDENTS

StudID StudName Group GrMentor
12 Ivan Petrov P3101 Egor Kirov
33 Vasily Ivanov P3102 Roman Ivov
34 Gleb Anisimov P3103 Egor Kirov
\[StudID \rightarrow Group\]

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

STUDENTS

StudID StudName Group GrMentor
12 Ivan Petrov P3101 Egor Kirov
33 Vasily Ivanov P3102 Roman Ivov
34 Gleb Anisimov P3103 Egor Kirov

$StudID \rightarrow Group$ $StudID \rightarrow GrMentor$ $Group \rightarrow GrMentor$ $StudID \rightarrow StudName$ $StudID, StudName \rightarrow StudName$

Минимальное множество функц. зависимостей

Множество функциональных зависимостей минимально, если:

Аксиомы Армстронга

  1. Рефлексивность: если $A_2$ — подмножество $A_1$, то $A_1 \rightarrow A_2$
  2. Дополнение: если $A_1 \rightarrow A_2$, то $A_1,A_3 \rightarrow A_2,A_3$
  3. Транзитивность: если $(A_1\rightarrow A_2)\land(A_2\rightarrow A_3)$,то $A_1\rightarrow A_3$

Нормализация

Нормализация - формальный метод для проверки/ доработки модели на основе функциональных зависимостей.

Ненормализованная форма

Если на пересечении строки и столбца встречается несколько значений:

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34
78
OPD
DBMS
14.01.19
29.12.20
55
789
Rebrov A.
Uvarov S.
345 Egor Kirov 34
87
OPD
History
14.01.19
25.01.19
55
342
Rebrov A.
Serov G.

Процесс нормализации

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34
78
OPD
DBMS
14.01.19
29.12.20
55
789
Rebrov A.
Uvarov S.
345 Egor Kirov 34
87
OPD
History
14.01.19
25.01.19
55
342
Rebrov A.
Serov G.

В дальнейшем при описании нормальных форм предполагается, что в каждом отношении один потенциальный ключ, который является первичным, определения НФ — не строгие.

Первая нормальная форма (1НФ)

Отношение, на пересечении каждой строки и столбца — одно значение.

Вариант 1: сделать из групп значений отдельные строки.

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34 OPD 14.01.19 55 Rebrov A.
123 Ivan Ivanov 78 DBMS 29.12.20 789 Uvarov S.
345 Egor Kirov 34 OPD 14.01.19 55 Rebrov A.
345 Egor Kirov 87 History 25.01.19 342 Serov G.

Отношение, на пересечении каждой строки и столбца — одно значение.

Вариант 2: разбить на таблицы, чтобы исключить группы

EXAMS

StudID ExamID ExamName ExDate ProfID ProfName
123 34 OPD 14.01.19 55 Rebrov A.
123 78 DBMS 29.12.20 789 Uvarov S.
345 34 OPD 14.01.19 55 Rebrov A.
345 87 History 25.01.19 342 Serov G.

STUDENTS

StudID StudName
123 Ivan Ivanov
345 Egor Kirov

Вторая нормальная форма (2НФ)

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

$A_1, A_2$ - атрибуты $R$

Полная функциональная зависимость: $A_2$ в полной функциональной зависимости от $А_1$, если $A_1\rightarrow A_2$, но нет зависимостей вида $A_3\rightarrow A_2$, где $A_3$ — подмножество $A_1$.

Полная функциональная зависимость

Полная функциональная зависимость: $A_2$ в полной функциональной зависимости от $А_1$, если $A_1 \rightarrow A_2$, но нет зависимостей вида $A_3 \rightarrow A_2$, где $A_3$ — подмножество $A_1$.

Из $А_1$ нельзя удалить атрибут, иначе - потеря функц. зависимости $A_1 \rightarrow A_2$

$StudID, ExamID \rightarrow ExDate$ — полная ф.з.

Вторая нормальная форма (2НФ)

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34 OPD 14.01.19 55 Rebrov A.
123 Ivan Ivanov 78 DBMS 29.12.20 789 Uvarov S.
345 Egor Kirov 34 OPD 14.01.19 55 Rebrov A.
345 Egor Kirov 87 History 25.01.19 342 Serov G.

Чтобы привести к 2НФ — убрать частичные зависимости от ключа:

  1. удалить атрибуты, зависящие от составляющих ключа из $R_1$;
  2. новое отношение $R_2$: удаленные атрибуты из $R_1 +$ соответствующий детерминант;

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34 OPD 14.01.19 55 Rebrov A.
123 Ivan Ivanov 78 DBMS 29.12.20 789 Uvarov S.
345 Egor Kirov 34 OPD 14.01.19 55 Rebrov A.
345 Egor Kirov 87 History 25.01.19 342 Serov G.

$StudID, ExamID \rightarrow StudName $

Частичная функц. зависимость

$StudID, ExamID \rightarrow ExamName$ $StudID, ExamID \rightarrow ExDate$ $StudID, ExamID \rightarrow ProfID$ $ProfID \rightarrow ProfName$

STUDENTS

StudID StudName ExamID ExamName ExDate ProfID ProfName
123 Ivan Ivanov 34 OPD 14.01.19 55 Rebrov A.
123 Ivan Ivanov 78 DBMS 29.12.20 789 Uvarov S.
345 Egor Kirov 34 OPD 14.01.19 55 Rebrov A.
345 Egor Kirov 87 History 25.01.19 342 Serov G.

$StudID, \sout{ExamID} \rightarrow StudName $

Частичная функц. зависимость

$\sout{StudID}, ExamID \rightarrow ExamName$ $StudID, ExamID \rightarrow ExDate$ $StudID, ExamID \rightarrow ProfID$ $ProfID \rightarrow ProfName$

StudID $\rightarrow$ StudName

ExamID $\rightarrow$ ExamName

Вторая нормальная форма

Вторая нормальная форма (2НФ)

Нет частичных зависимостей от потенциальных ключей

StudID → StudName

Частичная функц. зависимость

ExamID → ExamName StudID, ExamID → ExDate StudID, ExamID → ProfID ProfID → ProfName

Третья нормальная форма (3НФ)

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

$A_1, A_2, A_3$ — атрибуты $R$

Транзитивная функциональная зависимость — если для $A_1, A_2, A_3$ из $R$:

$A_1\rightarrow A_2\land A_2\rightarrow A_3$

то $A_3$ транзитивно зависит от $А_1$ через $A_2$ ($A_1$ функционально независим от $A_2,A_3$).

Преобразование в 3НФ

Чтобы привести к 3НФ — убрать транзитивные зависимости:

1)удалить из R1 атрибуты, транзитивно-зависимые от первичного ключа; 2)новое отношение R2: атрибуты (удаленные в 1.) + соответствующий детерминант;

Третья нормальная форма

Нет транзитивных зависимостей от потенциальных ключей:

$StudID, ExamID \rightarrow ExDate$ $StudID, ExamID \rightarrow ProfID$ $ProfID \rightarrow ProfName$

Транзитивная зависимость от первичного ключа

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

НФБК — отношение в НФБК, когда для всех функциональных зависимостей отношения выполняется условие: детерминант — потенциальный ключ.

$A_1\rightarrow A_2$ $A_1$ — детерминант функциональной зависимости.

Нормализация

Денормализация

Литература

PostgreSQL is released under the PostgreSQL License, a liberal Open Source license, similar to the BSD or MIT licenses. PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95) Portions Copyright © 1996-2020, The PostgreSQL Global Development Group Portions Copyright © 1994, The Regents of the University of California Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN “AS IS” BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.