您的表格设计很好,如果您还没有添加更多信息,例如购买日期到 items_bought 表格,您可能还没有这样做。
为了知道客户 #1 购买了您需要的商品的次数
select i.item_id, count(ib.item_id)
from item i
left join items_bought ib on ib.item_id = i.item_id and ib.customer_id = 1
group by i.item_id
order by i.item_id;
为此,您需要 items_bought 的索引。我会尝试以下两个,看看 DBMS 正在使用哪个,然后删除另一个:
create index idx1 on items_bought (item_id, customer_id);
create index idx2 on items_bought (customer_id, item_id);
如果有一个已经包含所需数据的表会更方便。这是一种数据仓库方法。你会添加一个表
dwh_customer_item (customer_id, item_id, amount)
在customer_id, item_id 上有一个主键。然后添加一个触发器,该触发器在将项目添加到数据库时添加行,添加这些行:
insert into dwh_customer_item (customer_id, item_id, amount)
select c.customer_id, new.item_id, 0 as amount from customer c;
以及每当客户添加到数据库时添加行的触发器,添加这些行:
insert into dwh_customer_item (customer_id, item_id, amount)
select new.customer_id, i.item_id, 0 as amount from item i;
最后一个触发器来增加每次插入 items_bought 的数量,添加这些行:
update dwh_customer_item
set amount = amount + 1
where customer_id = new.customer_id
and item_id = new.item_id;
有了这样的概念,您甚至可以从 items_bought 中删除旧行而不会丢失总数。
如果您希望将所有这些都添加到您的数据库中,这是您的选择。原始表很好,查询(提供了适当的索引)已经非常快了。