За последние 24 часа нас посетили 22716 программистов и 1224 робота. Сейчас ищут 743 программиста ...

Как проектировать БД для инет-магазина

Тема в разделе "MySQL", создана пользователем Koc, 12 сен 2008.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Собственно говоря задумываюсь о разработке тырнет-магазина. Встает вопрос: а как же проектировать базу? зайдем, к примеру, на http://fotomag.com.ua/ . На каждую технику идут разные характеристики. Например, для ноутбука это размер экрана, процессор, память, НЖМД и прочее. Для фотоаппарата это уже кол-во Мп, оптический зум, время выдержки, режимы съемки и тд. Как это все записывать в базу? Абсолютно не понимаю.

    ну есть база категории
    id|pid|title

    есть база товары
    id|category_id|и далее характеристики|цена.

    Как вот эти характеристики записывать, чтобы потом еще можно было сравнивать между собой 2 фотоаппарата?
     
  2. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    ORM - но тормознуто.
    или динамическое создание/редактирование таблиц с доп. пораметрами + UNION при выборке
     
  3. alBoo

    alBoo Активный пользователь

    С нами с:
    27 мар 2008
    Сообщения:
    63
    Симпатии:
    0
    ну можно что-то типа

    Категории
    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

    итого выделяеш отдельную таблицу с описанием всех возможных свойств товаров, а потом в другой таблице для каждого товара задаеш список соотв. параметров и их значений
    как-то так :)
     
  4. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я думал, что это очень плохо и так нельзя. Если делать так, то нужно отделить постоянные таблицы от "новых" разными префиксами.
    про ORM не понял

    alBoo, да, я подумывал о такой реализации. Боюсь, что будет сильно тормозить. И какого типа делать s_value? текст/варчар? Если на 1 товар будет 30 свойств (а на фотоаппаратах так и есть), то сколько же тогда будет записей в этой таблице?

    2all как думаете, что лучше: динамическое создание таблиц или то, что предлагает камрад alBoo?
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Тормоза будут на сортировке. На выборке более или менее быстро.
     
  6. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а вот еще вариант. Если, например, делаем какой-то тематический тырнет-магазин, пусть той же самой бытовой техники, то можно на этапе создания его сделать все таблицы для свойств и товаров. Потом, правда, если нужно будет добавить какой-то товар придется опять сидеть и колупать код.


    Кстати, как при динамических таблицах потома выборку делать? мы ж не знаем, че за поля там придуманы, как они называются и тд. Ну сделаем SELECT * FROM ... а как обрабатывать?
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    440Hz, спасибо. Как раздуплюсь после вчерашнего дня города, буду смотреть.
     
  9. Anonymous

    Anonymous Guest

    Чьорт, у вас тож был день города?? )
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ага, 2-ые выходные сентября. Днепропетровску уже эмм 231 вроде
     
  11. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а Минску вчера 941 :)
     
  12. Anonymous

    Anonymous Guest

    акуеть. ) Не, нам все 288
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А нам сегодня 70.
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    просмотрел
    ubercart под Drupal
    kiwe под ModX
    Magento
    Prestashop

    и все не то. Везде чего-то не хватает и что-то не так. Нужно самому писать, но нет времени и слабо все понимаю структуру БД.


    upd: в догонку вопрос: хранить в таблице сериализованный и загзипенный массив - это нормально? Поиск по нему выполнять не будем. Какую кодировку выбирать?
     
  15. Anonymous

    Anonymous Guest

    можно закономерный вопрос — для чего?
     
  16. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    понравилась организация наборов атрибутов в Magento.

    например, у нас набор атрибутов атр_холодильники:

    группа `Габариты (ВхШхГ, см)`
    а в ней атрибуты: `в упаковке`, `без упаковки

    группа Вес `(кг)`
    `нетто`, `брутто`

    атрибуты находятся в отдельных таблицах, и эти же атрибуты могут быть использованы в других наборах атрибутов, например `атр_телевизоры`. Как нам записать в БД набор атрибутов? Примерно так:

    PHP:
    1.  
    2. <?
    3. /**
    4. Атрибут1
    5. Группа1
    6. |-атрибут2
    7. |-атрибут3
    8. |-атрибут4
    9. Атрибут5
    10. Группа2
    11. |-атрибут6
    12. |-атрибут7
    13. |-атрибут7
    14.  
    15. Для групп нужно указать имя, для атрибутов их ID из базы атрибутов+находятся ли они в группе или нет. Код ниже показывает как это записать массивом, а потом в БД. Ключ t - type.
    16. */
    17. #
    18. $atrSet[0]['t'] = 'n';
    19. $atrSet[0]['n'] = NULL;
    20. $atrSet[0]['id'] = 1;
    21. #
    22. #
    23. $atrSet[1]['t'] = 'g';
    24. $atrSet[1]['n'] = 'Группа1';
    25. $atrSet[1]['id'] = NULL;
    26.  
    27. $atrSet[2]['t'] = 'a';
    28. $atrSet[2]['n'] = NULL;
    29. $atrSet[2]['id'] = 2;
    30.  
    31. $atrSet[3]['t'] = 'a';
    32. $atrSet[3]['n'] = NULL;
    33. $atrSet[3]['id'] = 3;
    34.  
    35. $atrSet[4]['t'] = 'a';
    36. $atrSet[4]['n'] = NULL;
    37. $atrSet[4]['id'] = 4;
    38. #
    39. #
    40. $atrSet[5]['t'] = 'n';
    41. $atrSet[5]['n'] = NULL;
    42. $atrSet[5]['id'] = 5;
    43. #
    44. #
    45. $atrSet[6]['t'] = 'g';
    46. $atrSet[6]['n'] = 'Группа2';
    47. $atrSet[6]['id'] = NULL;
    48.  
    49. $atrSet[7]['t'] = 'a';
    50. $atrSet[7]['n'] = NULL;
    51. $atrSet[7]['id'] = 6;
    52.  
    53. $atrSet[8]['t'] = 'a';
    54. $atrSet[8]['n'] = NULL;
    55. $atrSet[8]['id'] = 7;
    56. #
    57.  
    58. print_r($atrSet); echo"\n\n";
    59.  
    60. $atrSet = serialize($atrSet);
    61. print_r($atrSet); echo"\n\n";
    62. print_r(strlen($atrSet)); echo"\n\n";
    63.  
    64. $atrSet = gzcompress($atrSet, 9);
    65. print_r($atrSet); echo"\n\n";
    66. print_r(strlen($atrSet)); echo"\n\n";
    67. $atrSet = gzuncompress($atrSet);
    68.  
    69. $atrSet = unserialize($atrSet);
    70. print_r($atrSet); echo"\n\n";
    71. ?>
    72.  
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну какбе то, что я выше описал, можно по-другому [лучше] реализовать?
     
  18. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Koc

    если не надо делать выборок по атрибутам товаров, я бы лично не парился. я бы их в виде JSON хранил в базе все, кроме того, что идентифицирует запись и по чему делаются поиски / сортировки.
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    выборки по атрибутам будут. Напр. выбрать все моники, у которых диагональ 19" или все машинки, у которых ширина не превышает 400 мм. Имхо JSON нельзя. Это будет уж совсем просто, даже не интересно).


    а так, как хочу я - совсем сложно. Даже нереально)
     
  20. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Koc
    ты хочешь, или у тебя задача такая стоит? имхо, разные вещи))
     
  21. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я хочу. А задача стоит: организовать инет-магазин бытовой техники. Причем технического задания как такового нет вообще. Я предложил Битрикс или Мадженту. Решили начать с Мадженты, но интересно свое написать. Но ессно нет времени на это.
     
  22. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Koc

    имхо. я бы полные характеристики хранил в виде json в неиндексированном поле. еще в одном - указатель каталога, в третьем, опять таки в JSON'е, характеристики товара для поиска / сортировки.

    ну и все это добро должно кешироваться обязательно, чтоб достаточно тяжелыми отборами базу редко мучать.
     
  23. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Сейчас подобная задача стоит. Думаю о вот такой схеме:
    [​IMG]

    Какие плюсы:
    1. Легко добавляются новые параметры к категориям товара
    2. Сравнивать товары легче (?)
    3. Поиск по опциям значительно быстрее
    Минусы:
    Тормознутость...

    Еще, как вариант product_options
    id p_type p_id name value

    Выборка гораздо быстрее, но и гибкость ограничена.

    Что скажете?
     
  24. Представленная на картинке структура не приведена к 3NF.
    Вариант с product_options проще к дальнейшей модерницации.
     
  25. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А обязательно должна быть именно 3NF?
    Какая форма, на твой взгляд, наиболее оптимальная для базы с продукцией? (3NF, как я понимаю :) )