Каждый элемент, входящий в сущность, характеризуется одним и тем же набором атрибутов.
Таблица (инфоблок) находится в 1NF, если каждый её атрибут атомарен. | ||
Это означает, что:
Поясним второе на примере. Пусть Интернет-магазин торгует двумя видами товаров: флешками и художественными книгами. Все товары хранятся в одном инфоблоке Товары. При этом и у книг, и у флешек есть понятие объёма: для книг это количество страниц, а для флешек – количество мегабайт. Если в инфоблоке Товары завести атрибут Объём числового типа, то получится, что в одном поле хранятся данные одного физического типа (число), однако разных логических типов (объём книги и объём флешки – это совсем разные вещи). И если, например, отсортировать товары по полю Объём, то флешка на 500 мегабайт будет якобы больше, чем книга на 300 страниц – а такое сравнение, конечно же, лишено смысла. Или, например, нельзя помещать в одно и то же поле для книги – год выпуска, а для консервированного тунца – год истечения срока годности. | ||
Требования 1NF обязательны для выполнения.
На первый взгляд, хранение сериализованного массива в поле строкового типа – это отступление от 1NF. Однако такой способ хранения обычно применяется в том случае, если этот массив обрабатывается на уровне БД как единое целое (а уже потом, на уровне кода, его разбирают на элементы). Подобно тому, как в поле может храниться текст целой книги, а на сайте он может выводиться постранично. Если же вы используете сериализованный массив как способ хранения в одной ячейке целого ряда раздельных значений – значит, скорее всего, в вашей даталогической модели есть ошибка. | ||
Обычно атрибуты просто характеризуют элемент (например, человека зовут Иван). Но некоторые позволяют уникально его идентифицировать (например, этот человек имеет паспорт с номером 4505 123456). Такие идентифицирующие атрибуты называют ключевыми атрибутами (или первичными ключами, или просто ключами).
Первичный ключ (primary key, PK) – это атрибут или совокупность нескольких атрибутов сущности, позволяющая однозначно идентифицировать каждый элемент, входящий в сущность. | ||
Из этого следует, что значение атрибута-ключа всегда уникально. Например, может быть два человека с именем Иван, но не может быть двух человек с номером паспорта 4505 123456.
При этом у сущности может быть несколько уникальных атрибутов, но только один из них назначается первичным ключом.
Уникальные атрибуты, не входящие в первичный ключ, называют вторичными ключами (secondary keys). | ||
Например, у человека может быть ещё и кредитная карточка, номер которой уникален. Однако идентифицируют человека, как правило, всё же по паспорту, а не по кредитной карточке (всё зависит от предметной области: иногда номер карточки может оказаться важнее – и тогда именно он используется в качестве первичного ключа).
В том случае, если ключ состоит из нескольких атрибутов, он называется составным ключом. Как правило, такой ключ используется в развязочных таблицах (о них мы поговорим отдельно). | ||
При проектировании для Битрикса следует учитывать, что первичным ключом для этой системы всегда является ID элемента. У большинства объектов в Битриксе есть также поле CODE, которое может использоваться в качестве вторичного ключа, если контролировать его обязательность и уникальность (по умолчанию это поле необязательно и неуникально).
Таблица (инфоблок) находится в 2NF, если она находится в 1NF – и у неё есть правильно подобранный первичный ключ. | ||
Поясним на примере. Требуется сделать прайс-лист на джинсы. Пусть цена джинсов зависит от названия модели и от размера. Тогда ключом будет пара полей «наименование-размер», а неключевым атрибутом – «цена». Такая таблица удовлетворяет требованиям 2NF.
Наименование (PK) | Размер (PK) | Цена | ||
Джинсы «синий угар» | 34 | 2 800 | ||
Джинсы «синий угар» | 36 | 3 000 | ||
Джинсы «чёрный ворон» | 32 | 1 200 | ||
Джинсы «чёрный ворон» | 34 | 1 520 | ||
Теперь рассмотрим вариант, когда цена зависит только от модели (т.е. все джинсы «синий угар» вне зависимости от размера стоят одинаково, та же ситуация и с «чёрным вороном»).
Наименование (PK) | Размер (PK) | Цена | ||
Джинсы «синий угар» | 34 | 2 900 | ||
Джинсы «синий угар» | 36 | 2 900 | ||
Джинсы «чёрный ворон» | 32 | 1 400 | ||
Джинсы «чёрный ворон» | 34 | 1 400 | ||
Мы по-прежнему можем использовать пару «наименование-размер» в качестве первичного ключа, однако для поиска цены поле «размер» становится лишним, что не соответствует 2NF (цена зависит от составного ключа «наименование-размер» точно так же, как и от части ключа – поля «наименование»). Поэтому следует сделать наименование первичным ключом, а поле «размер» исключить из прайс-листа (а если всё-таки надо сохранить данные о том, каких размеров бывает каждая из моделей джинсов, следует организовать отдельную таблицу).
Наименование (PK) | Цена | ||
Джинсы «синий угар» | 2 900 | ||
Джинсы «чёрный ворон» | 1 400 | ||
Для инфоблоков Битрикса требование 2NF выполняется всегда, поскольку в качестве первичного ключа всегда выступает только один атрибут – ID.
В IDEF1x атрибуты, входящие в первичный ключ, подписываются над горизонтальной линией, а остальные – под ней. Справа от имени атрибута указывается его тип.
Имя атрибута в классическом варианте – это существительное в единственном числе (Наименование, Дата, Иллюстрация) либо – только для булевских полей! – утверждение со словом «эта/это/этот» (ЭтоПроплаченнаяНовость).
Атрибуты могут быть обязательными либо опциональными (optional). Так, например, у каждой новости должно быть название (обычно вместо Название применяют слово Наименование), но не всегда есть иллюстрация. Опциональные поля на IDEF1x-диаграмме отмечаются знаком (O).
Внимание! Часто вместо «O–optional» неверно читают «О–обязательное». В Visio при редактировании обязательное поле называется Req’d (required). | ||
Visio выводит очень подробную информацию о типе атрибута. Однако в большинстве случаев при проектировании для Битрикса вам не придётся проставлять максимальную длину поля или выбирать конкретный тип. Достаточно ограничиться более общими типами.
Атрибуты бывают следующих типов, предполагающих совершенно разные подходы к обработке и использованию хранящихся в них данных:
Для ввода данных о типах в Visio проще всего пользоваться Portable data type (ODBC), а результат смотреть уже на самой диаграмме.
В Битриксе нет выделенного булевского типа – вместо него используется либо тип Список, либо тип Строка с ограничением на ввод только Y или N.