Спроектировать БД

Тема в разделе "Базы данных", создана пользователем Phrack, 26 янв 2011.

Модераторы: latteo
  1. Phrack

    Phrack

    Регистр.:
    3 ноя 2010
    Сообщения:
    264
    Симпатии:
    38
    Необходимо спроектировать РБД. Конечно. для данного случаю подойдет скорее редиска, нежели мускул, однако, нужно сделать ну мускуле(или любой другой рбд)

    Буду говорить на конкретном примере, иначе просто запарюсь абстрактно все объяснять.

    Допустим есть объявления о продаже машин(книг, телефонов и тп), в которых есть обязательные поля (например, цена, марка, толщина) и "опции" (аля, ксеноновые фары, шнурок на шею и тд). Казалось бы, тут ничего сложного и это многие-ко-многим налицо. Но! так получилось, что некоторые опции - enumы (например антенна:нет;встроенная;внешняя). Как теперь здесь все сохранить?

    Требование:
    1. способность держать высокую нагрузку (то есть делать таблицу со 100 столбцами для 100 опций - не комильфо)
    2. возможность динамического добавления характеристик

    Нашел единственно расово-верный путь, но он труден и тернист.
    Делать таблицу с обязательными полями, с опциями и связать их через таблицу с item_id, param_id, value. Но опять же, тут есть несколько существенных минусов:
    • если огромное количество bool и всего несколько enum - трата ресурсов
    • нет ограничения целостности на уровне бд (то есть вместо нужного enum можно вставить что угодно)

    Вобщем, есть идеи?
     
  2. ukrlist

    ukrlist Создатель

    Регистр.:
    13 янв 2011
    Сообщения:
    44
    Симпатии:
    6
    Берем книгу и расписуем характеристики..
    Берем Телефон и расписуем характеристики..

    Попробуйте нарисовать задачу.
    Нпаравильно составленная БД это крах.
    Пример, допустим цвет может быть одинаковый у книги и у телефона, машины и т. д.
    Выпишите все характеристики всего и раскидывайте по БД, задавая им типы..
     
  3. Phrack

    Phrack

    Регистр.:
    3 ноя 2010
    Сообщения:
    264
    Симпатии:
    38
    я понимаю, что вы новый человек на форуме и набор постов - это приоритетная задача, однако, на форуме ценят полезные комментарии.
    Я знаю как делать простые БД, которые решают 80% задач. Здесь вопрос в добавлении динамики в бд и в сохранении целостности на уровне бд
     
    ukrlist нравится это.
  4. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    145
    Симпатии:
    108
    Выход такой, если дополнительных настроек очень много, то хранишь их в виде сериализованного массива или json строки.
    Для решения потребуется две таблицы, 1-я основная, 2-я для хранения возможных вариантов характеристик для каждого типа товара
    PHP:
    //1)название, описание,... доп. характеристики. 
    com_id|com_type|com_name|...|com_options
    1     
    phone  телефон|   |{"color":"red","clock":true,"memory":"встроенная 100мб +карта до 100гб"}
    //2)возможные характеристики
    opt_id|opt_type |opt_itemtype|opt_name|opt_code|opt_variats_code|opt_variats_name
    1     
    select  phone      цвет   color  |red,black,white |красный,черный,белый
    2     
    checkboxphone      часы   clock  |true,false      |есть,нет
    3     
    string  phone      память memory |null            |null
    Тут в зависимости от типа настроек формируешь селект, чекбокс или простую строку для формы, в случае со страницей, достаешь названия нужных настроек, по типу товара и коду характеристики.
    В принципе,opt_variats_code и opt_variats_name тоже можно загнать в одно поле как массив, так даже проще будет.
     
    Phrack нравится это.
  5. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    мой пример избавления от связей многие-ко-многим и соответственно лишний таблиц:

    n_id - сквозной идентификатор
    vc_name - название машины
    vc_year - год выпуска
    n_price - цена
    vc_option - список опций

    каждой опции соответствует строковый префикс группы (цвета - COLOR, фары - LAMP, наличие спойлера - SPLOILER), и суфиксы, которые указывают на положение внутри группы (цвета - BLUE,RED,WHITE, фары - KSENON, HALOGEN, PTF, спойлер - YES, NO). Соответствено опция выглядит как совмещение префикса и суффикса - "COLOR=BLUE", "COLOR=WHITE", "LAMP=HALOGEN" и т.д.

    в таблице все опции хранитм в одном поле vc_option виде "COLOR=BLUE,LAMP=HALOGEN,SPOILER=NO"

    выборка машин с галогеновыми фарами и спойлером:

    select * from cars where vc_option like ('%LAMP=HALOGEN%') and ('%SPOILER=YES%')

    получение всех характеристик по одной машине:

    $res = mysql_query ("select * from cars where n_id=8447");
    if ($r = mysql_fetch_array($res))
    {
    $options = explode ($r["vc_option"]);
    // если нужно получить массив разобраный по частям префикс, суффикс
    foreach ($options as $data)
    {
    $tmp = explode ("=",$options);
    $option[$tmp[0]] = $tmp[1];
    }
    // на выходе $option в виде: $option["COLOR"] = "BLUE" и т.д.
    }

    я бы еще с константами поигрался, чтобы от условий при выводе в будущем избавиться, типа

    $title["COLOR"] = "Цвет машины";

    и т.д.
     
    Phrack нравится это.