безграмотный
Новичок
Вопрос на гипотетическом собеседовании
Интересно услышать мнение общественности по следующему вопросу заданом на одном гипотетическом собеседовании.
Имеется инет магазин с хорошей посещаемостью к примеру 10000 человек в сутки, в магазине имеется скажем 10000 групп товаров и в каждой группе 100000 товаров. Нужно построить дерево товаров.
Таблица групп имеет скажем следующую структуру:
CREATE TABLE groups (
id int(10) unsigned primary key,
name varchar(255)
)
Таблица товаров имеет следующую структуру:
CREATE TABLE prods (
id int(10) unsigned primary key,
group_id int(10) unsigned not null,
name varchar(255)
)
group.id=prods.group_id
- Способ номер один, извлечь из базы все группы (группы в таблице групп уникальны) следующим запросом "SELECT * FROM groups" и на основании равенства id=group_id, где group_id есть идентификатор принадлежности товара определённой группе, извлекать товары принадлежащие каждой группе в цикле т.е. получиться 10000 обращений к таблице товаров.
- Способ номер два, извлечь сразу все группы и все товары следующими запросами:
"SELECT * FROM groups ORDER BY id" и
"SELECT * FROM prods ORDER BY group_id"
Результаты выборки первого селекта будут скажем в переменной $groups, результаты второго селекта в $prods.
И в обоих переменных будут двумерные массивы, где первый индекс будет индексом строки, второй индекс номером столбца.
И предлагается строить дерево в цикле примерно следующим образом:
<?php
$id=$id_2=0;
for ($i=0; $i<count($prods); $i+=3) {
if ($id!=$prods[$i]['group_id']) {
$id=$prods[$i];
$id_2++;
@$tree.=$group_id[$id_2]['name'].'начало новой группы в дереве';
} else {
@$tree.='добавление товара в дерево';
}
}
?>
Не вооружённым взглядом виден недостаток первого способа, слишком много обращений к табице товаров т.к. для каждой группы потребуется отдельное обращение к таблице товаров, групп у нас 10000 и именно это количество обращение и будет произведенно к таблице товаров при постройке дерева.
Недостаток второго способа в следующем, из БД извлекаются все группы одним запросом и товары тоже одним запросом т.е. будет иметься двумерный массив групп с размерностью 10000 по первому индексу и 2 по второму, так же будет иметься массив товаров с размерностью 100000 по первому индексу и 3 по второму.
Что общественность думает, какой способ лучше? Или может кто-то подскажет какое либо более удачное решение?
Интересно услышать мнение общественности по следующему вопросу заданом на одном гипотетическом собеседовании.
Имеется инет магазин с хорошей посещаемостью к примеру 10000 человек в сутки, в магазине имеется скажем 10000 групп товаров и в каждой группе 100000 товаров. Нужно построить дерево товаров.
Таблица групп имеет скажем следующую структуру:
CREATE TABLE groups (
id int(10) unsigned primary key,
name varchar(255)
)
Таблица товаров имеет следующую структуру:
CREATE TABLE prods (
id int(10) unsigned primary key,
group_id int(10) unsigned not null,
name varchar(255)
)
group.id=prods.group_id
- Способ номер один, извлечь из базы все группы (группы в таблице групп уникальны) следующим запросом "SELECT * FROM groups" и на основании равенства id=group_id, где group_id есть идентификатор принадлежности товара определённой группе, извлекать товары принадлежащие каждой группе в цикле т.е. получиться 10000 обращений к таблице товаров.
- Способ номер два, извлечь сразу все группы и все товары следующими запросами:
"SELECT * FROM groups ORDER BY id" и
"SELECT * FROM prods ORDER BY group_id"
Результаты выборки первого селекта будут скажем в переменной $groups, результаты второго селекта в $prods.
И в обоих переменных будут двумерные массивы, где первый индекс будет индексом строки, второй индекс номером столбца.
И предлагается строить дерево в цикле примерно следующим образом:
<?php
$id=$id_2=0;
for ($i=0; $i<count($prods); $i+=3) {
if ($id!=$prods[$i]['group_id']) {
$id=$prods[$i];
$id_2++;
@$tree.=$group_id[$id_2]['name'].'начало новой группы в дереве';
} else {
@$tree.='добавление товара в дерево';
}
}
?>
Не вооружённым взглядом виден недостаток первого способа, слишком много обращений к табице товаров т.к. для каждой группы потребуется отдельное обращение к таблице товаров, групп у нас 10000 и именно это количество обращение и будет произведенно к таблице товаров при постройке дерева.
Недостаток второго способа в следующем, из БД извлекаются все группы одним запросом и товары тоже одним запросом т.е. будет иметься двумерный массив групп с размерностью 10000 по первому индексу и 2 по второму, так же будет иметься массив товаров с размерностью 100000 по первому индексу и 3 по второму.
Что общественность думает, какой способ лучше? Или может кто-то подскажет какое либо более удачное решение?