按允许值或阻止值过滤50k +行

时间:2015-12-06 20:41:40

标签: mysql database database-design mariadb dynamic-columns

我有大约50k(和计数)产品的数据库。此外,我网站上的用户已宣布其所在国家/地区。

现在我需要添加到allowed_countriesblocked_countries等产品字段。

  • 产品可以将这些字段留空 - 它将向所有用户显示
  • 产品可以填充allowed_countries - 仅向该国家/地区的用户显示
  • 产品可以填充blocked_countries - 除了来自blocked_countries列表的用户外,它将向所有用户显示。

此类过滤应适用于产品目录,产品页面和搜索者(目前全文搜索)。

如何有效地为这些要求设计数据库?我所关心的是在相当大的负荷下的表现。我在考虑MariaDB 10.0.20中的动态列,但我不确定只有一个国家的过滤速度。

1 个答案:

答案 0 :(得分:2)

使用链接表

产品表 (id,其他数据)

国家表 (id,name等)

链接表 (product_id,country_id,allowed)all not null,1表示允许0表示diallowed

select * from product 
left join linking linking_table on linking_table.product_id = product.id 
left join counties_table on (countries_table.id = linking_table.country_id)

现在这里改变了

允许县

where countries_table.id = (USERS COUNTRY) and linking_table.allowed = 1

不允许

where countries_table.id = (USERS COUNTRY) and (linking_table.allowed = 1 or linking_table.allowed is null)

第二个增加了产品没有任何黑名单的情况。

这可能会为每个产品返回多行,因此您需要分组依据或返回不同的