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

Phrack

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

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

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

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

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

Вобщем, есть идеи?
 
книг, телефонов

Берем книгу и расписуем характеристики..
Берем Телефон и расписуем характеристики..

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

я понимаю, что вы новый человек на форуме и набор постов - это приоритетная задача, однако, на форуме ценят полезные комментарии.
Я знаю как делать простые БД, которые решают 80% задач. Здесь вопрос в добавлении динамики в бд и в сохранении целостности на уровне бд
 
Выход такой, если дополнительных настроек очень много, то хранишь их в виде сериализованного массива или 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     | checkbox| phone      | часы   | clock  |true,false      |есть,нет
3     | string  | phone      | память | memory |null            |null
Тут в зависимости от типа настроек формируешь селект, чекбокс или простую строку для формы, в случае со страницей, достаешь названия нужных настроек, по типу товара и коду характеристики.
В принципе,opt_variats_code и opt_variats_name тоже можно загнать в одно поле как массив, так даже проще будет.
 
мой пример избавления от связей многие-ко-многим и соответственно лишний таблиц:

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"] = "Цвет машины";

и т.д.
 
Назад
Сверху