HTML Diff
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>