表设计 - 需要建议

时间:2012-10-08 16:58:56

标签: mysql sql

我有一张用户过去购买的产品表。 e.g。

item_id - user_id - title - supplier_id - - supplier_name - date added

用户表

user_id - name

我还有一份供应商表格,例如

supplier_id - supplier_name

供应商不时会提交特别优惠,然后我想将这些优惠传递给我的用户......这可以是一个项目或全面的。

我的问题是如何最好地管理这个

当用户登录系统时,我会查看所有优惠,然后再次匹配他们过去购买的商品或整个供应商(如果全面提供)

我认为这可能会占用大量资源,说100000个用户和1000个提供了很多查询的提议....或者还有其他方式可以做到这一点吗?也许是一个更容易交叉引用的临时表。

我必须立即写下这篇文章,并希望确保尽可能高效地完成这项工作,但这对我来说是一个新的问题。

这是一个标准问题,有一个简单的解决方案吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我认为用两个不同的表来管理商品是有意义的。

  • 一个表格涉及从供应商处购买特定产品的用户。
  • 一个表格涉及从供应商处购买任何东西的用户。

在第一种情况下,您可以使用类似这样的查询来识别这些用户。 (代码未经过测试。)

select distinct user_id
from products  -- Seems like "purchases" might be a better name.
where supplier_id = ?
  and item_id     = ?;

在第二种情况下,使用类似这样的查询。

select distinct user_id
from products
where supplier_id = ?;

GROUP BY子句可能比SELECT DISTINCT提供更好的性能。

在第一种情况下,产品(项目)商品表可能看起来像这样。

supplier_id  item_id  offer_start  offer_end
--
1            10156    2012-08-01   2012-08-15

您可以通过以下方式获得接收这些优惠的用户。

select distinct user_id
from products  -- Seems like "purchases" might be a better name.
inner join item_offers on item_offers.supplier_id = products.supplier_id
                      and item_offers.item_id = products.item_id
                      and current_date between item_offers.offer_start 
                                           and item_offers.offer_end
where supplier_id = ?
  and item_id     = ?;

如果您要查询单个用户(通常是这种情况),您可以将用户ID添加到WHERE子句中。即使在一个巨大的表上,我也希望WHERE子句具有很强的选择性。

答案 1 :(得分:0)

我会创建一个名为“special_offers”(或任何你想要的)的新单独表格,并与供应商和用户建立多对多的关系。

答案 2 :(得分:0)

您只会查询特定用户的记录,因此这不应该是一个大问题。您可以查询过去订单中的所有不同item_id,以及不同的supplier_ids。这应该返回一个可管理的数字,然后您将这些ID加入您的商品表以显示相关的商品。您可以创建一个包含所有商品(特定商品和供应商特定)的表格,或将它们分成2个表格。