Принцип построения БД для хранения инфы о товарах

Asar

Новичок
Принцип построения БД для хранения инфы о товарах

Итак, имеется обычный каталог товаров, реализуемых конторой. В данный момент он имеет следующую структуру:

таблица товаров:
Id, куча разных полей с характеристиками, Brand_Id - Id брэнда (производителя товара), Parent_Id - Id раздела, к которому относится товар, Analogues - Id аналогов, Compatible - Id совместимых товаров.
Аналоги и совместимые - это такие же товары в этой же таблице.

таблица брэндов (Id-Название-Описание), таблица разделов (Id-Название-Id родительской секции раздела)

Допустим, нужно вывести всю эту байду для 30 товаров на одной странице. В данный момент это делается следующим образом:

<?php

Запрос на вывод 30 товаров:
$Query = mysql_query("SELECT * FROM parts LIMIT 30");
$Arr = mysql_fetch_assoc($Query);

Запрос на количество товаров в таблице:
$Quantity = mysql_query("SELECT count(*) FROM parts");
$QuantityArr = mysql_fetch_row($Quantity);


Лепим для каждого выводимого товара:
do { ?>

<p>
<?php

Запрос к таблице брэндов о названии брэнда товара:
$Query1 = mysql_query("SELECT * FROM brands WHERE Id = ".$Arr['Brand_Id']);
$Arr1 = mysql_fetch_assoc($Query1);

Запрос к таблице разделов о разделе товара:
$Query1_1 = mysql_query("SELECT * FROM parents_1 WHERE Id = ".$Arr['Parent_Id']);
$Arr1_1 = mysql_fetch_assoc($Query1_1);

Если есть совместимые товары, запрашиваем данные об этих товарах из таблицы товаров и данные о брэнде этих товаров из таблицы брэндов:
if (!empty ($Arr['Compatible'])) {
$Query2 = mysql_query("SELECT * FROM parts WHERE Id = ".$Arr['Compatible']);
$Arr2 = mysql_fetch_assoc($Query2);

$Query2_2 = mysql_query("SELECT * FROM brands WHERE Id = ".$Arr2['Id']);
$Arr2_2 = mysql_fetch_assoc($Query2_2);
}

Если совместимых нет - присваем соответствующим переменным пустые значения, чтобы не выводились значения предыдущих товаров:
else {
$Arr2='';
$Arr2_2 = '';
}

То же самое проводим для товаров-аналогов:
if (!empty ($Arr['Analogues'])) {
$Query3 = mysql_query("SELECT * FROM parts WHERE Id = ".$Arr['Analogues']);
$Arr3 = mysql_fetch_assoc($Query3);

$Query3_3 = mysql_query("SELECT * FROM brands WHERE Id = ".$Arr3['Id']);
$Arr3_3 = mysql_fetch_assoc($Query3_3);
}
else {
$Arr3='';
$Arr3_3 = '';
}

После чего выводим инфу о товаре через $Arr, $Arr1, $Arr1_1,
$Arr2, $Arr2_2, $Arr3, $Arr3_3 и цепляем картинку (типа Id.jpg)

Все бы это хорошо, но код довольно велик и, есть подозрение, далеко не идеален - проводится куча запросов для каждого товара, на что явно требуется время... К тому же, выводиться на одной странице вполне может товаров так 150, а в полях аналогов и совместимых товаров может быть несколько Id - тогда, следуя этому методу каждый раз придется выколупывать из строки отдельные Id, и для каждого опять проводить вычисления брэндов и прочего...

Отсюда вопрос: каким образом можно грамотно оптимизировать сей процесс? Искал/читал инфу по объединению таблиц, но пока что здесь ничего не применил... Или подскажите, где хоть порыться можно по данной тематике...
 

neko

tеam neko
спроси что-нибудь покороче
в этом никто разбираться не станет
 

alexhemp

Новичок
Asar

Сделать JOIN и убрать запросы на бренды, на разделы каталогов. Основные фичи SQL не используете, только самую примитивную форму SELECT.
 

Asar

Новичок
Так потому и использую самый примитив, что не в курсах отностильно непримитивных...
Насчет JOIN слышал уже краем уха, но на русском никак не найду, где об этом подробнее прочесть можно. Есть у кого-нибудь ссылка?
 

Asar

Новичок
За сюрприз спасибо...
Собственно, я там побывал уже, но там написано несколько "с места в карьер" - т. е. это статья для тех, кто уже знает, что такое join, где и зачем его применять и т. п. и хочет узнать подробности.
Я же до такого состояния еще не дорос. Т. е. я знаю, что join мне поможет и что "Необходимо учитывать, что в версиях до 3.23.17 оператор INNER JOIN не принимает параметр join_condition!", но не в курсах относительно того "а чего это, а как это"...
Если у кого есть инфа начальная - киньте ссылкой...
 

Asar

Новичок
Ок, смотрим туториалы и в пятый раз яндексы...

-~{}~ 01.03.05 13:10:

Таким образом...
Таблица с товарами, один из столбцов - Id брэнда, еще один - Id родительской секции. Вторая таблица - брэнды - Id и описание (хотя бы название). Третья таблица - родительские секции - Id и описание (хотя бы название). Насколько я понял - такой вариант будет вполне грамотным?
Тогда вопрос. Если родительских секций много (точнее, много уровней вложенных) - то правильным будет лепить таблицы типа ParentLevel1, ParentLevel2, ParentLevel3 и там описывать паренты следующего уровня? Т. е. название секции для товара берем из ParentLevel1, название секции, куда относится данная секция товара - из ParentLevel2 и т. д.?
 

GeT

Новичок
Asar
Посмотри мою соседнюю тему с похожим названием вот тут.
Там похожая проблема и есть нормальное решение!
 

Asar

Новичок
Пасиб за ссылку, наблюдал уже такое...
Кстати, еще вопросец:
Кто как хранит данные о товарах в корзине пользователя в инет-магазине? Каждому создаете отдельную таблицу id-количество или всех в одну загоняем id-количество-UserId? Я больше склоняюсь ко второму варианту, не копить же кучу таблиц (кстати, они должны быть не_временными, во всяком случае храниться в теч. месяца)?.. Или есть еще варианты?
 

GeT

Новичок
Asar
Я вообще храню:
table shop_cart (session_id || item_id || num_items)
пока так. Скажите способ получше! :D
 

Asar

Новичок
Насколько я понимаю, это и есть мой вариант с одной таблицей. По закрытии сессии у тебя данные удаляются или у тебя просто название поля такое?
 

GeT

Новичок
Asar
Вообще, я щас работаю над тем, чтобы "корзина" возобновлялась, если соединение было разорвано. Пока не готово, но скоро будет.
 

Asar

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

GeT

Новичок
Asar
то ли каждому по таблице-корзине
ИМХО - изврат!
Зачем КАЖДОМУ таблицу-то? Одну на всех и хватит. Представь, 100 пользователей одновременно юзают карзины - это у тебя 100 таблиц будет чтоли?
 

Asar

Новичок
Вот и я о том... Но, кто ж его знает, опыта то нету, может, так таки и лучше было бы в чем то... Ладно, буду делать одну, видимо...
 
Сверху