DG4All

DG4All 

Data Governance для Чайников

85subscribers

99posts

Showcase

19

Моделирование хранилищ данных - общие понятия. Часть 3

Нормальная форма - что это такое?

Всего их шесть штук 1NF, 2NF, 3NF, 4NF, 5NF, 6NF плюс одна загадочная DKNF. Коротенько про все формы на вики, подробно можно почитать в Часть 1 в учебнике Ребекки М.Райордан.
Нормальная форма - это состояние, к которому вам нужно привести свои данные, чтобы с ними можно было эффективно работать в базе данных.
Я расскажу только про первые три формы.
1NF. Данные находятся в первой нормальной форме, если в любом допустимом значении любого кортежа содержится только одно значение для каждого из атрибутов.
Всё просто - никаких массивов данных в ячейках таблиц, никаких перечисляемых через запятую значений.
Данные в таблице ниже не нормализованы, так как содержат описания двух отношений - Заказов и Клиентов, требуется декомпозировать таблицу и разделить на две отдельные.
Данные в таблице ниже не нормализованы, так как содержат описания нескольких значений в одной ячейке - Товары перечислены через запятую, требуется декомпозировать таблицу и разделить на отдельные строки для каждого товара.
А вот данные приведенные к первой нормальной форме - таблица содержит атрибуты, описывающие Заказы и в каждой ячейке мы видим только одно значение.
2NF. Данные находятся во второй нормальной форме, если они находятся в первой нормальной форме и каждый не ключевой атрибут функционально зависит от её потенциального ключа.

Это означает, что мы должны исключить из таблицы атрибуты, которые не имеют отношение к объекту Заказ. Но просто так их выкинуть нельзя, раз мы их включили в таблицу, значит нам нужна эта информация. В таких случаях необходимо провести декомпозицию таблицы - разделить её на 2, 3 и более таблиц, по количеству функционально связанных наборов атрибутов - отношений.
Представленную выше в первой нормальной форме таблицу декомпозируем на три: Заказы, Клиенты и Товары.
Раз - потенциальным ключом является номер заказа.
Два - потенциальным ключом является код клиента. Адрес и телефон клиента функционально не зависят от Заказа.
Три - потенциальным ключом является номер заказа. 
В третьей таблице имеем неясность: номер заказа не может быть потенциальным ключом в отношении, описывающем Товар. Тут нам нужны уточнения и дополнительный анализ.
На самом деле мы имеем дело с заказанным товаром, а не просто с ассортиментом, который предлагает магазин своим клиентам. Нам нужно немного изменить набор атрибутов в таблице, а наш потенциальный ключ станет составным. А для составных ключей мы используем суррогатные ключи (см.пост про Ключи).
Поле "Номер записи" - это наш суррогатный ключ, образованный от 2-х потенциальных ключей - Номер заказа и Код товара.
3NF. Данные находятся в третьей нормальной форме, если они находятся во второй нормальной форме и ни один не ключевой атрибут не находится в транзитивной функциональной зависимости от потенциального ключа.
Транзитивная функциональная зависимость возникает тогда, когда атрибут соотносится с потенциальным ключом не напрямую, а через другой атрибут.
Предположим, нам нужно доставить наши заказы по указанному адресу. Выглядит логичным, если адрес доставки мы укажем в таблице заказов, вот так:
Но с ракурса приведения данных к третьей нормальной форме, такое проектирование не корректно. Адрес доставки не является атрибутом заказа, а описывает местонахождение клиента или точнее место, по которому он готов принять данный заказ. Т.е. адрес доставки соотносится с заказом транзитивно - через Клиента. И правильный паттерн проектирования в этом случае будет таким:
При этом таблица Заказы остаётся без изменений, как показано в разделе 2NF.
Словарь терминов RDB:
Кортеж - это запись или строка в таблице (tuple, row).
Атрибут - это поле или заголовок в таблице с записями (column, attribute).
Отношение - таблица с записями и атрибутами (Relation).
Постскриптум: Ещё несколько слов про Отношения. На самом деле, если бы ООП - объектно-ориентированный подход (или проектирование) - появился чуть раньше, чем Кодд сформулировал свои принципы реляционной модели, то возможно мы бы с вами изначально оперировали бы терминами Сущность или Класс вместо Отношения. Имхо это одно и то же. 
Можно ли обойтись без нормальных форм в процессе моделирования данных? В целом да, при достаточной насмотренности на бизнес-процессы и функции, вам не составит труда правильно выделить Сущности (это наши Отношения), описать их через атрибуты и определить, какие из них являются потенциальными ключами (бизнес-ключи). А дальше протягиваем связи между сущностями и готова логическая модель данных!
Моделирование хранилищ данных - общие понятия. Часть 1
Моделирование хранилищ данных - общие понятия. Часть 2
Про сущности можно почитать вот тут.
А про моделирование сущностей - здесь.
Subscription levels3

Юзверь

$1.41 per month
Оставить чаевые автору :)
и получить ранний доступ к статьям и  материалам к ним (скачать можно в течение месяца с момента публикации)

Дата-Котик

$5.7 per month
Бессрочный доступ к статьям и материалам к ним

Мастодонт

$14.1 per month
Доступ ко всем статьям, материалам и к дополнительному контенту.
Или просто Большое спасибо автору
Go up