﻿
<h1 class=p1>Нормализация базы данных</h1>
<br>
<br>

<p class=prim><b><i>Определение:</i></b></p>
<p class=text><i>Схемой базы данных называется структура связей между полями и таблицами.</i></p>
<p class=prim><b><i>Определение:</i></b></p>
<p class=text><i>Нормализацией схемы базы данных называется процедура, производимая над базой данных с целью удаления в ней избыточности.</i></p>
<p class=text>Нормализация несет с собой немало преимуществ. Очевидно, что в нормализованной базе данных уменьшается вероятность возникновения ошибок, она занимает меньше места на жестком диске и т.д.</p>
<p class=text>Для того, чтобы лучше уяснить приведенное определение нормализации, рассмотрим следующий пример. Ниже показана таблица, в которой указаны фамилии сотрудников и их профессии:</p>
<p class=prim><b>Таблица 3.</b> Пример избыточности в таблицах базы данных</p>
<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=100%>
<TR><TD WIDTH="64%" VALIGN="TOP"><B><P>Профессия</B></TD>
    <TD WIDTH="36%" VALIGN="TOP"><B><P>Сотрудник</B></TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Инженер"</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Гусев И.К.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Инженер"</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Иванов П.В.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Рабочий"</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Иванов К.Л.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Рабочий"</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Дружков П.К.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Рабочий"</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Фомичев В.М.</TD>
</TR>
</TABLE>
<p class=text>Эта таблица избыточна - для каждого из сотрудников повторяются одинаковые названия профессий. Т.е. схема такой базы данных не нормализована.  Для небольшой базы данных это не критично, но в больших по объёму базах данных это скажется на размере базы и, в конечном счёте, на скорости доступа. Для нормализации необходимо разбить эту таблицу на две - для профессий (см. табл. 4) и для фамилий сотрудников (см. табл. 5).</p>
<p class=prim><b>Таблица 4.</b> Таблица профессий</p>
<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=100%>
<TR><TD WIDTH="65%" VALIGN="TOP"><B><P ALIGN="JUSTIFY">Профессия</B></TD>
    <TD WIDTH="35%" VALIGN="TOP"><B><P ALIGN="JUSTIFY">Первичный ключ</B></TD>
</TR>
<TR><TD WIDTH="65%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Инженер"</TD>
    <TD WIDTH="35%" VALIGN="TOP"><P ALIGN="JUSTIFY">1</TD>
</TR>
<TR><TD WIDTH="65%" VALIGN="TOP"><P ALIGN="JUSTIFY">"Рабочий"</TD>
    <TD WIDTH="35%" VALIGN="TOP"><P ALIGN="JUSTIFY">2</TD>
</TR>
</TABLE>
<p class=prim><b>Таблица 5.</b> Таблица сотрудников</p>
<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=100%>
<TR><TD WIDTH="64%" VALIGN="TOP"><B><P>Профессия (внешний ключ)</B></TD>
    <TD WIDTH="36%" VALIGN="TOP"><B><P>Сотрудник</B></TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">1</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Гусев И.К.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">1</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Иванов П.В.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">2</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Иванов К.Л.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">2</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Дружков П.К.</TD>
</TR>
<TR><TD WIDTH="64%" VALIGN="TOP"><P ALIGN="JUSTIFY">2</TD>
    <TD WIDTH="36%" VALIGN="TOP"><P ALIGN="JUSTIFY">Фомичев В.М.</TD>
</TR>
</TABLE>
<p class=text>Теперь каждый тип профессии обозначен уникальным числом, и строка в базе данных присутствует только в единственном экземпляре: в таблице профессий. Размер поля "профессия" уменьшился, так как строка занимает больше памяти, чем число.</p>
<p class=prim><b><i>Замечание</i></b></p>
<p class=text><i>В теории баз данных говорится о том, что схема базы данных должна быть полностью нормализована. При работе с полностью нормализованными базами данных необходимо применять весьма сложные SQL-запросы, что приводит к обратному эффекту - замедлению работы базы данных. Поэтому иногда для упрощения запросов даже прибегают к обратной процедуре - денормализации.</i></p>
