Собственно говоря задумываюсь о разработке тырнет-магазина. Встает вопрос: а как же проектировать базу? зайдем, к примеру, на http://fotomag.com.ua/ . На каждую технику идут разные характеристики. Например, для ноутбука это размер экрана, процессор, память, НЖМД и прочее. Для фотоаппарата это уже кол-во Мп, оптический зум, время выдержки, режимы съемки и тд. Как это все записывать в базу? Абсолютно не понимаю. ну есть база категории id|pid|title есть база товары id|category_id|и далее характеристики|цена. Как вот эти характеристики записывать, чтобы потом еще можно было сравнивать между собой 2 фотоаппарата?
ORM - но тормознуто. или динамическое создание/редактирование таблиц с доп. пораметрами + UNION при выборке
ну можно что-то типа Категории cat_id | cat_id_parent | cat_title Товары t_id | t_name | t_cost |... обязательые параметры для всех товаров (цена, скидки и пр.) Товары в категориях - ну типа один товар в нескольких категориях tc_id | tc_id_catalog | tc_id_tovar Типы свойств товаров (кол-во Мп, оптический зум, время выдержки, режимы съемки итдитп) type_id | type_name | + могут быть доп данные для сравнения этой характеристики Свойства товаров s_id | s_id_tovar | s_id_type | s_value итого выделяеш отдельную таблицу с описанием всех возможных свойств товаров, а потом в другой таблице для каждого товара задаеш список соотв. параметров и их значений как-то так
я думал, что это очень плохо и так нельзя. Если делать так, то нужно отделить постоянные таблицы от "новых" разными префиксами. про ORM не понял alBoo, да, я подумывал о такой реализации. Боюсь, что будет сильно тормозить. И какого типа делать s_value? текст/варчар? Если на 1 товар будет 30 свойств (а на фотоаппаратах так и есть), то сколько же тогда будет записей в этой таблице? 2all как думаете, что лучше: динамическое создание таблиц или то, что предлагает камрад alBoo?
а вот еще вариант. Если, например, делаем какой-то тематический тырнет-магазин, пусть той же самой бытовой техники, то можно на этапе создания его сделать все таблицы для свойств и товаров. Потом, правда, если нужно будет добавить какой-то товар придется опять сидеть и колупать код. Кстати, как при динамических таблицах потома выборку делать? мы ж не знаем, че за поля там придуманы, как они называются и тд. Ну сделаем SELECT * FROM ... а как обрабатывать?
могу дать исходники для динамического каталога. любые свойства для любых товаров. http://legkoshop.440hz.ru http://legkoshop.440hz.ru/www.legkoshop.ru.tar.gz если кому интересно могу а вдминку пустить. пишите.
просмотрел ubercart под Drupal kiwe под ModX Magento Prestashop и все не то. Везде чего-то не хватает и что-то не так. Нужно самому писать, но нет времени и слабо все понимаю структуру БД. upd: в догонку вопрос: хранить в таблице сериализованный и загзипенный массив - это нормально? Поиск по нему выполнять не будем. Какую кодировку выбирать?
понравилась организация наборов атрибутов в Magento. например, у нас набор атрибутов атр_холодильники: группа `Габариты (ВхШхГ, см)` а в ней атрибуты: `в упаковке`, `без упаковки группа Вес `(кг)` `нетто`, `брутто` атрибуты находятся в отдельных таблицах, и эти же атрибуты могут быть использованы в других наборах атрибутов, например `атр_телевизоры`. Как нам записать в БД набор атрибутов? Примерно так: PHP: <? /** Атрибут1 Группа1 |-атрибут2 |-атрибут3 |-атрибут4 Атрибут5 Группа2 |-атрибут6 |-атрибут7 |-атрибут7 Для групп нужно указать имя, для атрибутов их ID из базы атрибутов+находятся ли они в группе или нет. Код ниже показывает как это записать массивом, а потом в БД. Ключ t - type. */ # $atrSet[0]['t'] = 'n'; $atrSet[0]['n'] = NULL; $atrSet[0]['id'] = 1; # # $atrSet[1]['t'] = 'g'; $atrSet[1]['n'] = 'Группа1'; $atrSet[1]['id'] = NULL; $atrSet[2]['t'] = 'a'; $atrSet[2]['n'] = NULL; $atrSet[2]['id'] = 2; $atrSet[3]['t'] = 'a'; $atrSet[3]['n'] = NULL; $atrSet[3]['id'] = 3; $atrSet[4]['t'] = 'a'; $atrSet[4]['n'] = NULL; $atrSet[4]['id'] = 4; # # $atrSet[5]['t'] = 'n'; $atrSet[5]['n'] = NULL; $atrSet[5]['id'] = 5; # # $atrSet[6]['t'] = 'g'; $atrSet[6]['n'] = 'Группа2'; $atrSet[6]['id'] = NULL; $atrSet[7]['t'] = 'a'; $atrSet[7]['n'] = NULL; $atrSet[7]['id'] = 6; $atrSet[8]['t'] = 'a'; $atrSet[8]['n'] = NULL; $atrSet[8]['id'] = 7; # print_r($atrSet); echo"\n\n"; $atrSet = serialize($atrSet); print_r($atrSet); echo"\n\n"; print_r(strlen($atrSet)); echo"\n\n"; $atrSet = gzcompress($atrSet, 9); print_r($atrSet); echo"\n\n"; print_r(strlen($atrSet)); echo"\n\n"; $atrSet = gzuncompress($atrSet); $atrSet = unserialize($atrSet); print_r($atrSet); echo"\n\n"; ?>
Koc если не надо делать выборок по атрибутам товаров, я бы лично не парился. я бы их в виде JSON хранил в базе все, кроме того, что идентифицирует запись и по чему делаются поиски / сортировки.
выборки по атрибутам будут. Напр. выбрать все моники, у которых диагональ 19" или все машинки, у которых ширина не превышает 400 мм. Имхо JSON нельзя. Это будет уж совсем просто, даже не интересно). а так, как хочу я - совсем сложно. Даже нереально)
я хочу. А задача стоит: организовать инет-магазин бытовой техники. Причем технического задания как такового нет вообще. Я предложил Битрикс или Мадженту. Решили начать с Мадженты, но интересно свое написать. Но ессно нет времени на это.
Koc имхо. я бы полные характеристики хранил в виде json в неиндексированном поле. еще в одном - указатель каталога, в третьем, опять таки в JSON'е, характеристики товара для поиска / сортировки. ну и все это добро должно кешироваться обязательно, чтоб достаточно тяжелыми отборами базу редко мучать.
Сейчас подобная задача стоит. Думаю о вот такой схеме: Какие плюсы: 1. Легко добавляются новые параметры к категориям товара 2. Сравнивать товары легче (?) 3. Поиск по опциям значительно быстрее Минусы: Тормознутость... Еще, как вариант product_options id p_type p_id name value Выборка гораздо быстрее, но и гибкость ограничена. Что скажете?
Представленная на картинке структура не приведена к 3NF. Вариант с product_options проще к дальнейшей модерницации.
А обязательно должна быть именно 3NF? Какая форма, на твой взгляд, наиболее оптимальная для базы с продукцией? (3NF, как я понимаю )