Хорошо, пара вещей:
- php не имеет к этому никакого отношения. нормализация о данных моделирования
- нормализация не сводится к экономии места на диске. Речь идет об организации данных таким образом, чтобы их было легко обслуживать, что, в свою очередь, является способом поддержания целостности данных.
- нормализация обычно описывается в несколько этапов или «нормальных форм». На практике люди, которые проектируют реляционные базы данных, часто интуитивно понимают это правильно большую часть времени. Но все же хорошо знать о нормальных формах и их характеристиках. В интернете есть много документации по этому вопросу (например, http://en.wikipedia.org/wiki/Database_normalization),, и вам, безусловно, стоит провести собственное исследование, но наиболее важными этапами являются:
Нормализованные данные: на данном этапе данные не являются действительно табличными («реляционными»). Существует много дискуссий о том, что в действительности означает таблица, и эксперты не согласны друг с другом. но большинство людей согласны с тем, что данные ненормализованы в случае наличия многозначных атрибутов (= столбцы, которые могут содержать в качестве значения списки для одной строки), или в случае наличия повторяющихся групп (= несколько столбцов или несколько групп столбцов для хранения одного и того же тип данных)
Пример многозначного столбца: персона (имя, фамилия, номера телефонов)
Здесь номера телефонов означают, что в одном столбце может быть больше номеров телефонов
Пример повторяющейся группы: персона (имя, имя, фамилия, имя_детя_детей, имя_детей_детей_дата, имя_детей2, имя_детей_2, имя_детей_детей2 ..., имя_детей_детей, имя_детей_детей)
Здесь таблица person содержит несколько пар столбцов (child_first_name, child_birth_date) для хранения дочерних элементов человека.
Обратите внимание, что что-то вроде order (shipping_address, billing_address) не является повторяющейся группой: адреса для выставления счетов и доставки могут быть похожими частями данных, но каждый из них имеет свою особую роль для заказа, и оба они просто представляют разные аспекты Заказ. child1 - child10 - нет - у детей нет определенных ролей, и список детей является переменным (вы никогда не знаете, сколько групп вы должны зарезервировать заранее)
В обоих случаях, многозначные столбцы и повторяющиеся группы, вы в основном имеете структуру "вложенной таблицы" - таблицу в таблице. Говорят, что данные представлены в 1NF (первая нормальная форма), если ничего из этого не происходит.
1NF - это структурная харакеристика: табличная форма данных. Все последующие нормальные формы связаны с устранением избыточности. Избыточность возникает, когда одна и та же информация хранится независимо несколько раз. Избыточность - это плохо: если вы хотите изменить какой-либо факт, вы должны изменить его в нескольких местах. Если вы забыли случайно один из них, у вас есть противоречивые данные - данные противоречат самим себе.
Существует множество процессов, которые могут устранить избыточность, каждый из которых приводит к более высокой нормальной форме, вплоть до 1nf до 6nf. Тем не менее, как правило, большинство баз данных адекватно нормализованы на уровне 3nf (или вариации блеска, называемой нормальной формой Бойса-Кодда, BCNF). Вы должны изучить 2nf и 3nf, но принцип очень прост: таблица адекватно нормализована, если:
- таблица в 1nf
- таблица имеет ключ (комбинация столбца или столбца, значения которой являются обязательными, и которая уникально идентифицирует строку - т. Е. Может быть только одна строка, имеющая эту комбинацию значений в столбцах ключа)
- между неключевыми столбцами нет функциональных зависимостей
- неключевые столбцы функционально не зависят от части ключа (но полностью функционально зависят от всего ключа).
функциональная зависимость означает, что значение столбца может быть получено из другого столбца. простой пример:
позиция_ заказа (идентификатор заказа, номер товара, идентификатор клиента, код товара, описание товара, сумма)
давайте предположим, что (order_id, item_number) является ключевым. Код продукта и описание продукта функционально зависят друг от друга: для одного конкретного кода продукта вы всегда найдете одно и то же описание продукта (как если бы описание продукта было функцией кода продукта). Проблема в следующем: предположим, что описание продукта изменяется для конкретного кода продукта, вам нужно изменить все заказы, которые используют этот код продукта. забудьте только один, и у вас есть противоречивая база данных.
Способ решить эту проблему - создать новую таблицу продуктов с (product_code, product_description), имеющей (product_code) в качестве ключа, а затем вместо того, чтобы хранить все поля продукта в заказе, хранить только ссылку на строку в продукте. таблица в записях order_item (в этом случае order_item должен хранить только product_code, что достаточно для поиска строки в таблице product и поиска product_description)
Итак, как вы можете видеть, с этим решением вы действительно экономите место (не сохраняя все эти описания продуктов в каждом элементе order_item, который происходит при заказе продукта), и вы получаете больше таблиц (отделив продукт от order_item), но просто помните, что это не из-за экономии дискового пространства: это из-за того, что вы устраняете избыточность, тем самым облегчая обслуживание данных. потому что теперь вам нужно изменить только одну строку в таблице продуктов, чтобы изменить описание