Хорошо, несколько вещей:
- PHP не имеет ничего общего с этим. нормализация касается данных моделирования
- нормализация не касается экономии дискового пространства. Речь идет об организации данных, чтобы они могли легко обслуживаться, что, в свою очередь, способ сохранить целостность данных.
- Нормализация обычно описывается в несколько этапов или «нормальных форм». На практике люди, которые разрабатывают реляционные базы данных, часто интуитивно «правили» в большинстве случаев. Но все же хорошо знать о нормальных формах и их характеристиках. Существует много документации на что в Интернете (Fe http://en.wikipedia.org/wiki/Database_normalization), и вы, конечно, должны делать вам собственные исследования, но наиболее важные этапы:
unormalized данные: на данном этапе, данные не по-настоящему табличной ('реляционная'). Существует много дискуссий о том, что на самом деле означает табличное, и эксперты не согласны друг с другом. но большинство людей согласны с тем, что данные являются ненормализованными, если существуют многозначные атрибуты (= столбцы, которые могут для одной строки содержать списки как значение) или в случае повторения групп (= несколько столбцов или несколько групп столбцов для хранения того же тип данных)
Пример многозначных колонок: человек (first_name, last_name, номера телефоны) Здесь, номера телефонов подразумевает, что может быть больше номеров телефонов, которые хранятся в одном столбце
Пример из повторяющейся группы: человек (first_name , last_name, child1_first_name, child1_birth_date, child2_first_name, child2_birth_date ..., childN_first_name, childN_birth_date) Здесь таблица person имеет несколько пар столбцов (child_first_name, child_birth_date) t o храните детей этого человека.
Обратите внимание, что что-то вроде order (shipping_address, billing_address) не является повторяющейся группой: адреса для выставления счетов и доставки могут быть похожими частицами данных, но каждая из них имеет свою особую роль для заказа, оба просто представляют собой другой аспект заказа. child1 thru child10 нет - дети не имеют определенных ролей, а список детей является переменным (вы никогда не знаете, сколько групп вы должны зарезервировать заранее)
В обоих случаях многозначные столбцы и повторяющиеся группы, вы в основном есть структура «вложенная таблица» - таблица в таблице. Говорят, что данные находятся в 1NF (первая нормальная форма), если ни одно из них не происходит.
1NF - это структурная характеристика: табличная форма данных. Все последующие нормальные формы связаны с устранением избыточности. Резервирование происходит, когда одна и та же информация хранится несколько раз. Избыточность - это плохо: если вы хотите изменить какой-то факт, вы должны изменить его в нескольких местах. Если вы забудете случайность одного из них, у вас есть непоследовательные данные - данные противоречат сами себе.
Существует много процессов, которые могут устранить избыточность, каждая из которых ведет к более высокой нормальной форме, вплоть до 1nf до 6nf. Однако, как правило, большинство баз данных адекватно нормализуются при 3nf (или вариации, которые называются нормальной формой Boyce-codd, BCNF). Вы должны изучить 2nf и 3nf, но принцип очень прост: таблица адекватно нормализована, если:
- таблица находится в 1nf
- таблица имеет ключ (комбинацию столбца или столбца, значения которого требуется, и который однозначно идентифицирует строку - т. е может быть только одна строка, имеющий эту комбинацию значений в ключевые столбцы)
- нет функциональных зависимостей между некванными столбцами
- не-ключевые столбцы не являются функциональными endent на части ключа (но полностью функционально зависит от всего ключа).
Функциональная зависимость означает, что значение столбца может быть получено из другого столбца. Простой пример:
Order_Item (order_id, ITEM_NUMBER, customer_id, product_code, PRODUCT_DESCRIPTION, сумма)
давайте предположим (order_id, ITEM_NUMBER) является ключевым фактором. product_code и описание продукта функционально зависят друг от друга: для одного конкретного product_code вы всегда найдете одно и то же описание продукта (как будто описание продукта является функцией product_code). Проблема заключается в следующем: предположим, что описание продукта изменяется для определенного кода продукта, вам нужно изменить все заказы на этот товар product_code. забудьте только одно, и у вас есть несогласованная база данных.
Способ создания новой таблицы продуктов (product_code, product_description) с ключом (product_code) в качестве ключа, а затем вместо сохранения всех полей продукта хранить только ссылку на строку в таблицу продукта в записях order_item (в этом случае order_item должен сохранять код продукта только, что достаточно, чтобы найти строку в таблице продуктов и найти товар-описание)
Итак, как вы можете видеть, с этим решением вы делаете на самом деле сэкономить место (не сохраняя все эти описания продуктов в каждом order_item, который происходит, чтобы заказать продукт), и вы получите больше таблиц (отделите продукт от order_item). Но просто помните, что это не из-за сохранения дискового пространства: это потому, что вы устранить избыточность, что делает i t легче поддерживать данные. потому что теперь вам нужно изменить одну строку в таблице продуктов, чтобы изменить описание
У вас есть хороший ответ начался, но можете ли вы уточнить, когда было бы неплохо использовать нормализацию и когда это было бы? – jerebear
@jerebear Ну .. Это зависит. В общем, могут быть причины производительности для де-нормализации данных. Они в основном специфичны для работы конкретной базы данных. Если есть сомнения, обратитесь к нормализованным данным. Просто имейте в виду, что есть исключения из правила. – troelskn