我觉得这个问题可能已经问过一千次了,所以我很抱歉,如果它已经回答了。如果是这样,可有人点我到正确的职位/链接?

我试图做的是建立了我的网站面导航。它使用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_select1a_select2应用的过滤器的一个子集的产品的所有属性。所以,如果我使用Office Depot公司的粘合剂的例子,我想选择蓝色或黑色的颜色和“8.5×11”的大小后,将显示所有可用的属性。

我然后使用PHP代码删除重复并安排所得到的属性到一个这样的数组:

attributes[name1] = (val1, val2, val3, ...)
attributes[name2] = (val1, val2, val3, ...)

有没有一种办法可以加快我的查询,或者更有效地写?我在属性表上的名字建立索引和值(和也对所有的ID号)。但是,如果有人选择几个属性,则该查询运行缓慢。

有关提前,点击你的帮助,谢谢 斯里达尔

有帮助吗?

解决方案

“我然后使用PHP代码删除重复”

它不会接着比例的。

在我读 http://www.amazon.com/Data-Warehouse-Toolkit -Techniques维/ 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

然后whichver日期“范例”您正在使用,抓住所有从该维度表中的ID和

 select * from the fact table where the fact.dateregisteredid is IN( ... the ids from the date dimension table that represent your time period)

数据的这些“索引视图”应驻留在一个单独的数据库中,并且改变到在生产的对象应队列记录在分析系统重新索引。大型网站可能批在非高峰时间的统计报告应用他们的纪录总是滞后几个小时或几天。我总是试图保持它的第二,如果架构支持它。

如果您正在显示的行数预览,你可能有相当长的一段优化或高速缓存来实现也是如此。

基本上概括起来讲,将数据复制和反规范化。该技术的推移名称为“数据仓库”或OLAP(联机分析处理)。

有更好的方法,使用商业数据库,如Oracle,但星型模式使得它提供给任何与开源关系数据库和一定的时间。

您一定要阅读工具,但他讨论了很多事情,可以节省大量的时间。喜欢用更新的数据处理,并保留审计历史报告应用程序的策略。对于每一个问题他概述多种解决方案,其中的每一个都适用于不同的上下文。

它可以扩展到数百万行的,如果你不采取简单的出路和不必要的连接使用一吨。

其他提示

您可以根据您的规范化数据库表生成一个小表。结果 例如:

> SELECT * FROM product_facet
product_id | facet_type | facet_value
1          | color      | blue
2          | color      | blue
3          | color      | green
4          | color      | yellow
1          | speed      | slow
2          | speed      | slow

然后,只需做此查询来获取每个属性总:

SELECT facet_type, facet_value, COUNT(facet_value) as total
FROM product_facet
GROUP BY facet_type, facet_value;

结果:

facet_type | facet_value | total
color      | blue        | 2
color      | green       | 1
color      | yellow      | 1
speed      | slow        | 2

当与条件进行搜索,可以通过匹配产品ID选择小面的表:

SELECT facet_type, facet_value, COUNT(facet_value) as total
FROM product_facet
WHERE product_id in (SELECT product_id FROM products WHERE ... )
GROUP BY facet_type, facet_value;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top