MySQL和分面导航(按属性过滤)
作者:互联网
我觉得这个问题可能已经被问过了一千次,所以如果有人回答,我会道歉.如果是这样,有人能指出我正确的帖子/链接?
我要做的是为我的网站构建一个分面导航.它使用MySQL,这里是我正在使用的表的草图:
products: - id - title - description
attributes: - product_id - name - value
categories: - id - name
products_to_categories: - product_id - category_id
我想要做的是当你在一个类别时显示可用属性的列表,允许你为每个属性选择一个或多个值.举个例子,从Office Depot:http://www.officedepot.com/a/browse/binders/N=5+2177/查看此页面
到目前为止,我已经使用了很多连接来过滤多个属性:
SELECT products.*, a_options.* FROM products_to_categories AS pc, products, attributes AS a_options, /* list of attribute/value pairs I can continue to refine on */ attributes AS a_select1 /* first selected attribute */ attributes AS a_select2 /* second selected attribute */ ... WHERE pc.category_id = 1 AND products.id = pc.product_id AND a_options.product_id = products.id AND a_options.name != 'Color' AND a_options.name != 'Size' AND a_select1.product_id = products.id AND a_select1.name = 'Color' AND (a_select1.value = 'Blue' OR a_select1.value = 'Black') AND a_select2.product_id = products.id AND a_select2.name = 'Size' AND a_select2.value = '8.5 x 11'
基本上,a_options将返回那些产品的所有属性,这些产品是我使用a_select1和a_select2应用的过滤器的子集.因此,如果我使用Office Depot中的Binders示例,我想在选择Blue或Black for Color和“8.5 x 11”之后显示所有可用属性.
然后我使用PHP代码删除重复项并将结果属性排列到这样的数组中:
attributes[name1] = (val1, val2, val3, ...) attributes[name2] = (val1, val2, val3, ...)
有没有办法可以加快查询速度或更有效地编写查询?我在属性表中的名称和值(以及所有ID号)上设置了索引.但如果有人选择了几个属性,那么查询运行速度很慢.
在此先感谢您的帮助,
斯里达尔
解决方法:
“然后我使用PHP代码删除重复项”
它不会扩展.
在我读完http://www.amazon.com/Data-Warehouse-Toolkit-Techniques-Dimensional/dp/0471153370之后,我推出了方面&过滤机制不停.
基本的想法是你使用星型模式..
您创建一个存储事实的事实表
customerid | dateregisteredid | datelastloginid
1 | 1 | 1
2 | 1 | 2
您可以将外键用于存储属性的维度表
date_registered
Id | weekday | weeknumber | year | month | month_year | daymonth | daymonthyear
1 | Wed | 2 | 2009 | 2 |2-2009 | 4 | 4-2-2009
然后你使用哪个日期“范例”,从该维度表中获取所有ID
select * from the fact table where the fact.dateregisteredid is IN( ... the ids from the date dimension table that represent your time period)
这些数据的“索引视图”应位于单独的数据库中,对生产中对象的更改应将该记录排入队列,以便在分析系统中重新编制索引.大型网站可能会在非高峰时段将其记录批量处理,统计报告应用程序始终会滞后几小时或几天.如果架构支持它,我总是尽量保持第二.
如果要显示rowcount预览,则可能还需要进行一些优化或缓存.
基本上总结一下,你复制数据和反规范化.该技术的名称为“数据仓库”或OLAP(在线分析处理).
有更好的方法,使用像Oracle这样的商业数据库,但是星型模式使任何拥有开源关系数据库的人都可以使用它.
你一定要阅读工具包,但他讨论了许多可以节省大量时间的事情.与处理更新数据的策略一样,并在报告应用程序中保留审核历史记录.对于每个问题,他都概述了多个解决方案,每个解决方案都适用于不同的环境.
如果你不采取简单的方法并使用大量不必要的连接,它可以扩展到数百万行.
标签:mysql,multiple-tables,faceted-search 来源: https://codeday.me/bug/20190717/1484979.html