2010-01-23 2 views
0

Пожалуйста, я не знаю. Хотя я сделал некоторые чтения по этой теме. Все, что я знаю, используется, чтобы сделать данные в базе данных более эффективными и удобными в обращении. И он также может использоваться для экономии дискового пространства. И, наконец, если вы использовали нормализацию. Вам придется создавать больше таблиц.Как применить нормализацию к mysql, используя php

Теперь у меня есть много вопросов, которые нужно задать. Во-первых, как нормализация поможет сэкономить дисковое пространство или другое пространство, занимаемое базой данных. Во-вторых, Можно ли добавлять данные по нескольким таблицам, используя только 1 запрос. Пожалуйста, помогите, я просто новичок, желающий учиться у вас. Благодарю.

ответ

2

Хорошо, несколько вещей:

  1. PHP не имеет ничего общего с этим. нормализация касается данных моделирования
  2. нормализация не касается экономии дискового пространства. Речь идет об организации данных, чтобы они могли легко обслуживаться, что, в свою очередь, способ сохранить целостность данных.
  3. Нормализация обычно описывается в несколько этапов или «нормальных форм». На практике люди, которые разрабатывают реляционные базы данных, часто интуитивно «правили» в большинстве случаев. Но все же хорошо знать о нормальных формах и их характеристиках. Существует много документации на что в Интернете (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, но принцип очень прост: таблица адекватно нормализована, если:

  1. таблица находится в 1nf
  2. таблица имеет ключ (комбинацию столбца или столбца, значения которого требуется, и который однозначно идентифицирует строку - т. е может быть только одна строка, имеющий эту комбинацию значений в ключевые столбцы)
  3. нет функциональных зависимостей между некванными столбцами
  4. не-ключевые столбцы не являются функциональными 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 легче поддерживать данные. потому что теперь вам нужно изменить одну строку в таблице продуктов, чтобы изменить описание

0

Normalization - это набор правил. Чем больше вы следуете, тем выше уровень «нормализации» вашей базы данных. В общем, уровень 3 - наивысший уровень.

Нормированные данные теоретически «чище», чем ненормированные данные. Это упрощает его рационализацию и устраняет избыточность, что снижает вероятность выхода данных из синхронизации.

С точки зрения оценки, однако, нормализованные данные не всегда являются лучшим дизайном, даже если это теоретически. Если вы действительно не знаете более тонкие точки, целью нормализованных данных является не такая уж плохая идея.

+0

У вас есть хороший ответ начался, но можете ли вы уточнить, когда было бы неплохо использовать нормализацию и когда это было бы? – jerebear

+0

@jerebear Ну .. Это зависит. В общем, могут быть причины производительности для де-нормализации данных. Они в основном специфичны для работы конкретной базы данных. Если есть сомнения, обратитесь к нормализованным данным. Просто имейте в виду, что есть исключения из правила. – troelskn

0

На вопрос 2: Нет возможности вставить данные в несколько таблиц с одним запросом.
См. Синтаксис INSERT.

В дополнение к другим ответам, вы также можете выполнить поиск здесь на SO для нормализации и поиска, например. вопрос: Normalization in MySQL

2

Есть много подобных вопросов на StackOverflow уже, например, Can someone please give an example of 1NF, 2NF and 3NF in plain english?

Посмотрите на Связанные боковой панели справа для связки из них. Это поможет вам начать.

Что касается ваших конкретных вопросов:

  • Нормализация экономит дисковое пространство за счет сокращения избыточного хранения данных. Это имеет другое преимущество: если в вашей базе данных имеется несколько копий данного атрибута сущности, они могут выйти из синхронизации, а если у вас есть нормализованная база данных и используется ссылочная целостность, этого не может произойти.

  • INSERT заявление ссылается только на одну таблицу. A TRIGGER в инструкции вставки может добавлять строки в другие таблицы, но нет возможности передавать данные на триггер, кроме тех столбцов в таблице, которые породили его.

    Если вам нужно вставить зависимые строки после вставки строки в родительскую таблицу, используйте функцию LAST_INSERT_ID(), чтобы получить автоматически сгенерированное значение первичного ключа последнего оператора INSERT в вашем сеансе.

2

Я думаю, вы узнаете об этом, когда начнете создавать схему для своей базы данных.
Обращайте внимание на обратное, когда вы добавляете поле, которое существует где-то еще в вашей базе данных.

Обратно я имею в виду, спросите себя: если мне нужно изменить поле, сколько запросов мне нужно запустить? Возможно, вы закончите с ответом, что вам потребуется выполнить 2 или X раз запрос, чтобы изменить содержимое столбца. Держите его простым, это означает, что вы назначаете идентификатор для каждого содержимого, которое вы дублировали в своей базе данных.

Например, принимая колонке address

это не хорошо

update clients set address = 'new address' where clientid=500; 
update orders set address = 'new address' where orderid=300; 

хороший подход был бы

create a addresses table 
//and run a single query 
update addresses set address = 'new address' where addressid=100; 

И использовать адрес идентификатор 100 везде в таблице базы данных в качестве внешнего ключа reference (clients + orders), таким образом вы достигнете того, что идентификатор 100 не изменился, но если вы обновите содержимое адреса, все связанные таблицы будут pi ck до изменения.

Уровень 3 нормализации достаточно на этот раз для вас.

0

в phpmyadmin> 4.3.0, в структуре -> Структура таблицы, мы получили выше таблицы:

«Печать» «Предложить структуру таблицы» «Таблица треков» «Переместить столбцы» «Улучшить структуру таблицы», в разделе «Улучшить структуру таблицы» вы получили мастер, который говорит:

Улучшение структуры таблицы (нормализация):
Выберите до какого шага вы хотите, чтобы нормализовать
Первого этапа нормализации (1nf)
второго этапа нормализации (1NF + 2НФ)
третьего шага нормализации (1NF + 2NF + 3NF)

Смежные вопросы