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, и для каждого опять проводить вычисления брэндов и прочего...
Отсюда вопрос: каким образом можно грамотно оптимизировать сей процесс? Искал/читал инфу по объединению таблиц, но пока что здесь ничего не применил... Или подскажите, где хоть порыться можно по данной тематике...
Итак, имеется обычный каталог товаров, реализуемых конторой. В данный момент он имеет следующую структуру:
таблица товаров:
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, и для каждого опять проводить вычисления брэндов и прочего...
Отсюда вопрос: каким образом можно грамотно оптимизировать сей процесс? Искал/читал инфу по объединению таблиц, но пока что здесь ничего не применил... Или подскажите, где хоть порыться можно по данной тематике...