0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы разберем третью нормальную форму реляционной модели, а также ее требования.</p>
1
<p>В этом уроке мы разберем третью нормальную форму реляционной модели, а также ее требования.</p>
2
<p>Будем работать с текущей структурой:</p>
2
<p>Будем работать с текущей структурой:</p>
3
<p><strong>users</strong></p>
3
<p><strong>users</strong></p>
4
<p><strong>goods</strong></p>
4
<p><strong>goods</strong></p>
5
<p><strong>order_items</strong></p>
5
<p><strong>order_items</strong></p>
6
<h2>Третья нормальная форма</h2>
6
<h2>Третья нормальная форма</h2>
7
<p>Третья нормальная форма включает в себя два пункта:</p>
7
<p>Третья нормальная форма включает в себя два пункта:</p>
8
<ul><li>Таблица должна быть во второй нормальной форме</li>
8
<ul><li>Таблица должна быть во второй нормальной форме</li>
9
<li>Все колонки в таблице зависят от первичного ключа и не зависят друг от друга</li>
9
<li>Все колонки в таблице зависят от первичного ключа и не зависят друг от друга</li>
10
</ul><p>Первое требование уже выполнено, так как:</p>
10
</ul><p>Первое требование уже выполнено, так как:</p>
11
<ul><li>Таблица соблюдает требования первой нормальной формы</li>
11
<ul><li>Таблица соблюдает требования первой нормальной формы</li>
12
<li>Все неключевые атрибуты таблицы зависят от первичного ключа</li>
12
<li>Все неключевые атрибуты таблицы зависят от первичного ключа</li>
13
</ul><p>Поэтому разберем подробнее второе требование.</p>
13
</ul><p>Поэтому разберем подробнее второе требование.</p>
14
<h2>Зависимость колонок от первичного ключа, но не друг от друга</h2>
14
<h2>Зависимость колонок от первичного ключа, но не друг от друга</h2>
15
<p>Стоимость заказа зависит от цены товара. При этом цена товара зависит от самого товара, то есть от<em>good_id</em>. Чтобы привести таблицу к третьей форме, нужно вынести цену в товар:</p>
15
<p>Стоимость заказа зависит от цены товара. При этом цена товара зависит от самого товара, то есть от<em>good_id</em>. Чтобы привести таблицу к третьей форме, нужно вынести цену в товар:</p>
16
<p><strong>goods</strong></p>
16
<p><strong>goods</strong></p>
17
<p>Наша таблица приобретает такой вид:</p>
17
<p>Наша таблица приобретает такой вид:</p>
18
<p><strong>order_items</strong></p>
18
<p><strong>order_items</strong></p>
19
<p>С одной стороны, мы выполнили большую часть необходимой нормализации, с другой - новая структура имеет большой недостаток. Цена товара - вещь изменяемая, а вот стоимость покупки, которую мы совершили в прошлом - нет. Когда изменяется цена товара, изменится стоимость всех совершенных покупок, в которые входил данный товар. С точки зрения бухгалтерии и истории покупок это недопустимо.</p>
19
<p>С одной стороны, мы выполнили большую часть необходимой нормализации, с другой - новая структура имеет большой недостаток. Цена товара - вещь изменяемая, а вот стоимость покупки, которую мы совершили в прошлом - нет. Когда изменяется цена товара, изменится стоимость всех совершенных покупок, в которые входил данный товар. С точки зрения бухгалтерии и истории покупок это недопустимо.</p>
20
<p>Это значит, что цена товара должна копироваться в таблицу<em>order_items</em>. Но и в таблице<em>goods</em>она тоже нужна. В первую очередь для вывода на сайте на витрине.</p>
20
<p>Это значит, что цена товара должна копироваться в таблицу<em>order_items</em>. Но и в таблице<em>goods</em>она тоже нужна. В первую очередь для вывода на сайте на витрине.</p>
21
<p>Адрес тоже зависит от пользователя, но более сложным образом. У одного пользователя может быть несколько адресов. Если учитывать все, что мы говорили про нормальные формы, перенести адреса в таблицу пользователей нельзя. Мы не можем хранить несколько значений в одной колонке и не можем дублировать записи, так как нарушится уникальность первичного ключа.</p>
21
<p>Адрес тоже зависит от пользователя, но более сложным образом. У одного пользователя может быть несколько адресов. Если учитывать все, что мы говорили про нормальные формы, перенести адреса в таблицу пользователей нельзя. Мы не можем хранить несколько значений в одной колонке и не можем дублировать записи, так как нарушится уникальность первичного ключа.</p>
22
<p>Правильное решение - завести под адреса собственную таблицу. В ней адрес будет связан с пользователем, а вместо поля<em>address</em>в таблице заказов появится поле<em>user_address_id</em>.</p>
22
<p>Правильное решение - завести под адреса собственную таблицу. В ней адрес будет связан с пользователем, а вместо поля<em>address</em>в таблице заказов появится поле<em>user_address_id</em>.</p>
23
<h2>Выводы</h2>
23
<h2>Выводы</h2>
24
<p>В этом уроке мы изучили третью нормальную форму. Теперь ваших знаний о формах в реляционной модели достаточно, чтобы работать с самыми распространенными задачами в базах данных.</p>
24
<p>В этом уроке мы изучили третью нормальную форму. Теперь ваших знаний о формах в реляционной модели достаточно, чтобы работать с самыми распространенными задачами в базах данных.</p>