Attribute-Value в одной таблице или Create table для уникальных наборов значений атрибутов?

Anchor

Новичок
Всех приветствую.

Для БД универсального, коробочного скрипта интернет-магазина был выбран паттерн Flat table. Т.е. значения товаров будут храниться не в одной таблице EAV, а для каждого типа товара будет создаваться таблица.

В таблицах типов будет много значений которые лучше куда-то отделить в "уникальные наборы значений". Т.е. например "цвет", "текстура", "материал". Писать миллион раз в каждой записи "красный","желтый",... "пластмасса", "Дигидро-альфа-эргокриптин"... - вот от этого нужно избавиться. Вместо этого, естественно, будут id значений. И здесь, опять приходим к Attribute-Value в одной таблице vs Create table =)))
Итак, нужно определиться где хранить "уникальные наборы значений", наподобие значений цветов, значений материалов. В одной таблице? Или для каждого атрибута создавать по таблице?

1.EAV. По идеи он так и просится сюда. Действительно, нам советуют EAV, тогда когда кол-во атрибутов велико, а количество записей не велико. Если делать таблицами - то они будут содержать мало записей. Недостатки EAV я думаю итак известны - это скорость, и сложность 3-хэтажных запросов. Но... Для меня как для человека учившегося на мат.факе, EAV, в первую очередь, не симпатичен тем, что коверкает самую основную идеологию РБД - relation, "отношения". Все последующее строение будет "оторвано" от математики. Не я не фанат) и тоже за практичные решения) Просто мое сугубо индивидуальное мнение, EAV целесообразен: Если 1)Атрибуты очень динамичны (каждые неск-ко часов и даже каждые 10мин, они изменяются/добавляются/удаляются) И ПРИ ЭТОМ 2)Кол-во записей таблиц(у которых меняется структура) очень велико (>1млн. записей). При одновременном выполнении этих условий - без EAV просто никак. Каждое изменение (ALTER TABLE) будет блокировать базу, и будет выполнятся очень долго.

2.flat table. Насколько я понимаю, непосредственно кол-во таблиц в БД не значительно влияют на скорость. Встает лишь вопрос удобства. Но ведь ничего не мешает таблицам прилепить префикс "z_"/"zz_" и все они будут отображаться в конце БД. Хоть их там тыща - растут себе вниз БД да и все. А имена их заданы по строгому формату "zz_"."type_value_"."{atribute_name}"

Вообщем хочу услышать ваши мнения, приветствуются ЛЮБЫЕ рассуждения=)))
 

флоппик

promotor fidei
Команда форума
Партнер клуба
EAV как раз таки классически-каноничное решение в реляционных бд, вообще-то.
 

Anchor

Новичок
EAV как раз таки классически-каноничное решение в реляционных бд, вообще-то.
Почему классически-каноническое решение считают антипатерном?
http://stackoverflow.com/questions/20782760/difference-between-two-table-structure/20783125#20783125
http://www.slideshare.net/interlabs-ru/model-patterns
http://tonyandrews.blogspot.ru/2004/10/otlt-and-eav-two-big-design-mistakes.html
 

Sufir

Я не волшебник, я только учусь
В postgres есть hstore (key-value). Сам не пользовался, но говорят удобно и быстро. Минус - специфично (ну и тоже "неканоничненько", наверное).
 
Последнее редактирование:

С.

Продвинутый новичок
Почему классически-каноническое решение считают антипатерном?
EAV не антипаттерн. Он нужен там, где нужен и ненужен там, где ненужен. На третьей ссылке чувак в качестве примера берет примитивнейшую одномерную задачу и демонстрирует, что с EAV она решается сложнее, чем без оного. Дебил!

В твоем конкретном случае EAV ложится вполне гармонично. Плодить плоские таблицы -- ошибочный урок, пройденный уже давно.
 

fixxxer

К.О.
Партнер клуба
В случае с postgresql, в большинстве случаев hstore или jsonb с GIN/GIST индексом будет эффективнее и удобнее.
 
Сверху