2015-08-06 3 views
-2

У меня есть несколько таблица формирования цепочки, как это:базы данных Нормализация цепочки

table1

product_id SERIAL NOT NULL, 
name varchar, 

таблица2 (отдельно от table1, так как же имя продукта, но может быть другой цвет)

table2_id 
product_id integer, 
color varchar, 
FOREIGN KEY (product_id) REFERENCES table1 (product_id) ON DELETE CASCADE 

Таблица3 (отдельный из таблица2 т.к. такой же товар цвет но бывает другой размер)

table3_id 
table2_id integer, 
size varchar, 
FOREIGN KEY (table2_id) REFERENCES table2 (table2_id) ON DELETE CASCADE 

например, данные о продукте может быть

a chair (name) - red (color) - 100cm(size) 
a chair (name) - red (color) - 200cm(size) 
b chair (name) - green (color) - 100cm(size) 
b chair (name) - green (color) - 200cm(size) 
c chair (name) - black (color) - s(size) 
c chair (name) - black (color) - m(size) 
d chair (name) - black (color) - null(size) 
e chair (name) - gold (color) - big(size) 
e chair (name) - gold (color) - small(size) 

если следовать нормализация удалить дубликат, так что я разделить их как 3 таблицы, но я не уверен, цепочки, как этот правильной или нет

+2

Что вы делаете, это * не * нормализация. Нормализация не вводит новые столбцы (например, идентификаторы). Вы также не предоставляете информацию, необходимую для нормализации (FD и JD). И если product_ids 1: 1 с именами в таблице1, тогда таблица примеров данных уже * есть * в 5NF. Итак, у вас есть некоторые заблуждения. Я уже объяснил это [здесь] (http://stackoverflow.com/questions/31841269/postgresql-database-design-for-ecommerce) (только что отредактирован). – philipxy

+0

1. Ваши «потому что» непонятны, и вы не объясняете связь между каждым «потому что» и существование соответствующей таблицы. 2. * Пожалуйста, скажите a), что строка в вашей «таблице данных продукта» указывает в терминах product_id, имени, цвета и размера и b) все случаи, когда значение столбца должно всегда отображаться с тем же значением подзаголовка для набор колонок, который его не включает. – philipxy

ответ

0

Да, это хорошо, но, возможно, модель должна быть что-то вроде:

product -<product_variant>- product_size 

        V 
        | 
      product_colour 
+0

Спасибо за ответ, вы имеете в виду мои данные, подобные вашему примеру? Я не уверен, что понимаю, что вы имеете в виду? Я думаю, что его больше похоже на «product -> product_color -> product_size ----> product_price' и' product -> product_color -> product_size ----> product_qty', кажется, мне нужно связать с «product -> product_color -> product_size ' – user1775888

+0

Таблица вариантов продукта может быть дочерним элементом таблиц Product, Product Size и Product Color и содержать цену. –

+1

'@DavidAldridge (& @ user1775888): Я не думаю, что пользователь1775888 понимает варианты продукта, я думаю, он думает, что у него должен быть идентификатор каждый раз, когда данный подзадача значения появляется более одного раза. Т.е. я думаю, что данные, на которые он фактически связан, - это пример данных и что он уже в 5nf. – philipxy

-1

Это вторая версия same question вы представили. Ответ тот же.

Продукт является сущностью. Размер и цвет являются атрибутами.

В таблице содержатся объекты. Каждая сущность представлена ​​строкой. Поля каждой строки являются атрибутами каждого объекта. Вы не создаете новую таблицу каждый раз, когда вам нужно добавить атрибут к сущности. Это затрудняет работу с реляционными базами данных.

+0

Объекты не представлены строками, они представлены значениями. Атрибуты - это двоичные отношения, которые представлены парами значений, а не отдельными столбцами. Таблицы/строки представляют собой одно или несколько отношений между объектами. См. Статью Чэня «Модель отношения сущностей - к единому представлению данных». – reaanb

+0

Я признаю, что не знаком с Ченом, и вы не предоставляете ссылку для этого. Я могу ссылаться только на все реляционные записи базы данных - в значительной степени Date, et al. Ваше описание строк, сущностей и отношений имеет смысл только в очень узком контексте таблиц пересечений, где строка действительно представляет собой взаимосвязь. Однако таблицы пересечений здесь не были предметом обсуждения. – TommCatt

+0

Хорошо, я нашел ссылку. Оказывается, вы описали кортеж из набора отношений (стр. 12).Это далеко не тема этой беседы. – TommCatt

0

Похоже, что вы считаете, что вам нужен идентификатор каждый раз, когда данный подзадача значения появляется более одного раза в таблице. То есть вы пытаетесь удалить «дубликаты», которые не нужно удалять. Одно и то же значение, появляющееся более одного раза, не является «дубликатом» в смысле нормировки и не обязательно является плохим. Также ни одно использование нескольких таблиц и идентификаторов не является нормализацией. (Я уже пытался решить это определение таблицы «Цепочка» антишаблон here.)

От this answer:

Проблема состоит в том, что автобус останавливается несколько раз на ту же остановку в других часы, как я могу хранить эту информацию, избегая избыточности?

Нет такой проблемы. Подземелье может появляться более одного раза в таблице, есть ли «избыточность» или нет. (Все, что вы думаете, что это значит. Хотя можно заменить подстрок, которые появляются несколько раз по идентификаторам плюс другой таблицы, то нужно более присоединяется для того же результата запроса. См this answer.)

Или от that answer's link :

Это не имеет никакого отношения к нормализации. Нормализация никогда не создает новые имена столбцов. «Я не хочу, чтобы« Nintendo »дублировался, ошибочно.По сути, нет ничего неправильного со значениями, появляющимися во многих местах. См. Ответы от sqlvogel & себя here.

«Резервирование» не относится к значениям, появляющимся в нескольких местах. Речь идет о нескольких строках, в которых говорится о приложении. При использовании такого дизайна существуют две основные проблемы: говорить о некоторых вещах, связанных с несколькими строками (в то время как нормализованная версия включает только одну строку); и нет никакого способа сказать только одну из вещей за раз (с которой может помочь нормализация). Если вы создадите два разных независимых утверждения о Nintendo, вам понадобятся две таблицы и Nintendo, упомянутые в каждом из них. Строки Re, содержащие заявления о приложении, см. this. (И искать другие ответы на «утверждение» или «критерий» таблицы). Нормализация помогает, потому что она заменяет таблицы, строки которых содержат элементы формы «... И ...» другими таблицами, в которых указано «...» отдельно. См. this и this. (Обычно ошибочно считается, что включение или включение исключает несколько похожих столбцов, избегая столбцов, значения которых имеют повторяющуюся структуру и/или заменяют строки идентификаторами, но хотя это могут быть хорошие дизайнерские идеи, они не нормализуются .)

От my answer at that answer's first link:

Если SUBJECT_MODULE это строки, где «[SUBJECT_NAME] имеет [MODULE_N AME], идентифицированный [MODULE_ID] ", и у субъекта может быть более одного модуля, а затем где-то у вас должно быть есть несколько упоминаний об этом предмете (возможно, через его название) с упоминаниями разных модулей (возможно, по имени или id). Это не предполагает избыточности.

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