|
|
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
Суть проблемы такова: В данный момент дописываю интернет магазин (компьютеры, комплектующие, портативные компы и тд). К вопросу продумывания структуры базы подошел не совсем основательно, т.к. это первый более ни менее большой проект. На начальном этапе, пока в базу добавлялись одни ноутбуки, нетбуки и тд, казалось бы, все нормально. Но вот дальшей встал вопрос о добавлении комплектухи и подобных товаров, т.к. у ноутбуков и им подобным кол-во аттрибутов (полей в таблице) ~24 + у каждого вида комплектующих еще по 5-6 уникальных для каждого вида аттрибутов, т.е. в процессе таблица должна расти в ширину, вроде и терпимо, но: В поисках решения проблемы я отправился в интернеты. Ну и собственно для себя выделил два основных способа построения базы: 1) Single Table Inheritance (STI) - данная структура предполагает собой ОДНУ таблицу для всех товаров всех видов и, как я и предполагал, она будет рости в ширину и большинство полей в ней будет NULL-евыми. Вроде бы и кол-во товаров не должно превышать 5-6 тысяч ( по предварительным прогнозам ) т.е. таблица с примерно 40-50 полями и 5000-6000 строками без проблем будет возвращать нужные значения в считанные мгновения. И таки да, такая структура является реляционной БД, что для меня лично было откровением. Тут в "админке" при добавлении товара в большую таблицу я просто указываю какие поля заполнять, остальные автоматом становятся NULL. 2)Entity-Attribute-Value (EAV) - предполагает собой разбиение товаров на три таблицы: - Entity - Таблица, где хранится инфо о ВСЕХ товарах, но в виде 4-5 основных столбцов (одинаковых для всех). Таких как: id, навание, цена, производитель и тд. -Attribute- хранит в себе весь список аттрибутов для каждого вида товара в виде (id_attribute, attr_value) т.е. получается довольно таки длинная таблица, как я понял. Если, допустим, будет 1000 ноутбуков по 15 уникальных параметров - это 15000 строк ( не так уж и много, но что есть то есть) -Value- таблица, которая связывает Entity и Attribute внешними ключами, пары вида (id_product, id_attribute) т.е. размер ее будет чуть больше таблицы Attribute. Итого: мы имеем разложенную по полочкам информацию о товаре, которая хранится "тупо" индексами в базе. Но, опять же, начитавшись в тырнетах выделил для себя следующие минусы этой структуры: -Запросы будут ОЧЕНЬ(как по мне) большие. Чтобы вывести карточку товара нужно будет нехило натыкать INNER JOINов -Сложность структуры, а в следствии и путаница возникает по части движка (оный пишу на PHP), опять все переделывать и тд. -И вообще: стоит ли игра свеч ? При таком количестве товаров стоит ли извращаться таким образом ? Лично я, больше склоняюсь к первому варианту, т.к. товаров, по сути, не очень много, как для интернет магазина. Ну и конечно число полей в таблице вряд ли превысит 50. А число записей 6000-7000. Вот собственно что я хотел сказать и что спросить у умов программирования) Спасибо за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 12:35 |
|
||
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
Мне кажется EAV правильно будет не так как у вас , а отдельно таблицу с описаниями атрибутов (id_attr, name, type и т.д.) и отдельно таблицу (id_tovar, id_attr, value) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 14:20 |
|
||
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
К минусам EAV добавьте полное отсутствие ограничений (косяки, буде такие случатся увидят пользователи или что хуже вообще не увидят и не купят) Дальше тормоза для выборки: строка достается не за раз, а за N раз (пусть и по индексу), где N количество атрибутов Невозможность отдельных индексов. и так далее. Вы не заметили еще один вариант - общая таблица предок (не знаю как оно правильно называется) - то бишь все общие свойства всех товаров внесены в одну таблицу, а дочерние (связанные с основной как 1:1) содержат специфические детали Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 17:12 |
|
||
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
Спасибо большое за ответы! Да, действительно - не учел такой вариант! Думал над чем-то подобным, когда есть главная таблица, goods(id,title,price,img) и есть таблица параметров, одна для всех товаров (id,id_good,par1,par2...), но это мне показалось теми же яйцами (STI) только в профиль). Ваш вариант очень понравился )) Где-нибудь пробовали реализовать или видели реализации подобные ? не будет проблем с фильтрацией и выборкой товаров ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 17:34 |
|
||
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
те же яйца это будет вьюха Код: sql 1. 2. 3. 4. 5. alexandr.novitskiy не будет проблем с фильтрацией и выборкой товаровЕсли вы ТОЧНО знаете в какой таблице искать (то бишь ищете не во вьюхе которая выше) то найдется все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 04:21 |
|
||
|
SIT (Single Table Inheritance) - небольшой интернет магазин.
|
|||
|---|---|---|---|
|
#18+
alexandr.novitskiy... число полей в таблице вряд ли превысит 50. А число записей 6000-7000. Делай одну таблицу и непарься. Только предупреди клиента об ограничениях. А то ведь завтра они захотят пылесосами торговать или товарами секс индустрии ... Вся проблема из-за того что сначала делаем а потом думаем. Попробуй в следующий раз поменять порядок действий. Практика показывает что лучше потратить лишнюю неделю на устаканивание вопросов, чем потом говорить - ОЙ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 10:49 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37891500&tid=1541604]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 435ms |

| 0 / 0 |
