Помогите со структурой таблицы

Читающий
На сайте с 23.04.2009
Offline
60
497

Есть таблица с товаром, основные поля:

id | name | group | ... (всякие хар-ки)

Из этих товаров юзеры составляют наборы, не более 50 единиц товара в каждом, получаю массив вида :

Array(

[cart] => Array( [1] => 2 [185] => 1 [186] => 1 [187] => 3 [188] => 2 [190] => 2 [192] => 2 [199] => 3 [200] => 2 [201] => 1 [204] => 3 [206] => 1 [208] => 1 [253] => 2 [258] => 2 [303] => 2 [311] => 1 [352] => 1 [368] => 1 [393] => 2 )
[cart_name] => Название (задаётся пользователем)
[user_name] => Имя пользователя (задаётся пользователем)
[group] => 6 (группа товаров)
)

Массив с индексом [cart]: ключ - id товара, значение - кол-во товара.

Как организовать структуру таблицы под эти данные, для последующей удобной выборки и различных статистических отчетов.

Например, самый популярный товар в группе, в скольких наборах есть определенный товар и т.д.

Лучший доход для файлового трафика: Без бана АВ (http://goo.gl/F4Lem). А так же здесь (goo.gl/HzCxo) и здесь (goo.gl/B5BDC) Закроем продуктовые магазины за не уникальное содержание ©
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

Мне кажется, что [group] в полученном наборе - излишнее. А в остальном, нормализация данных:


create table goods (
int id primary key,
varchar title,
int groups_id foreign key references groups(id)
);

create table orders(
int id primary key,
varchar title,
varchar customer
);

create table order_items(
int id primary key,
int orders_id foreign key references orders(id),
int goods_id foreign key references goods(id),
int quantity
);

На foreign key полях сделать, понятное дело, индексы.

В скольки наборах есть определенный товар:


select count(distinct orders_id) from order_items where goods_id = :id_товара

Top10 популярных товаров в группе:


select title, count(distinct goods_id) as cnt
from order_items
join goods on (goods.id = order_items.goods_id)
where groups_id = :id_группы
group by title
order by cnt desc
limit 10

Далее можно оптимизировать под запросы, например кешировать агрегаты (денормализация).

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
IL
На сайте с 20.04.2007
Offline
435
#2
Оптимизайка:
Top10 популярных товаров в группе:

Для популярности ИМХО, правильнее sum(quantity) .. но общий смысл не меняется.

* и от group by title я бы отказался.. =)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Читающий
На сайте с 23.04.2009
Offline
60
#3
Оптимизайка:
например кешировать агрегаты (денормализация).

Это вообще для меня тёмный лес...

В остальном попробую разобраться, книжек умных почитаю на крайний случай.

В table order_items я так понимаю будет строка на каждый использованный товар?

Это их так дофига нарастёт, удаляться они не будут ни когда.

А нельзя как нибудь одной таблицей обойтись? Вроде этого:

id | name | item_1 | pcs_1 | item_2 | pcs_2 | ... | item_50 | pcs_50
Оптимизайка
На сайте с 11.03.2012
Offline
396
#4

Да, верно понимаете, по строке на товар. То, что они будут прибавляться, ничего страшного. Одной таблицей обходиться неправильно, не буду объяснять почему. Читайте про нормальные формы

Читающий
На сайте с 23.04.2009
Offline
60
#5

Оптимизайка, спасибо Вам за помощь, пошёл курить мануалы, а то все глаза до них не доходили....

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