我有一个艺术家,专辑和曲目的大型数据库。这些项目中的每一个都可能有一个或多个通过胶粘表(track_attributes,album_attributes,artist_attributes)分配的标签。有几千(甚至几十万)个标签适用于每种商品类型。高性能多层标签过滤
我试图完成两项任务,而且我很难让查询执行可接受的操作。
任务1)获取有任何给定的标签(如果有艺术家在专辑有任何给定的标签(如果提供的所有音轨))与任何给定的标签(如果有的话)。任何一组的标签可以不存在(即仅一个轨道标记是有效的,没有艺术家或唱片标签)
变异:结果也可呈现由艺术家或按专辑,而不是由轨道
任务2)获取应用于前一个过滤器结果的标签列表,以及每个给定标签有多少个轨道的计数。
我所追求的是方法中的一些一般指导。我尝试了临时表,内部连接,IN(),到目前为止,我所做的所有努力都会导致响应缓慢。我之后的结果的一个很好的例子可以在这里看到:http://www.yachtworld.com/core/listing/advancedSearch.jsp,除了他们只有一层标签,我正在处理三个。
表结构:
Table: attribute_tag_groups
Column | Type |
------------+-----------------------------+
id | integer |
name | character varying(255) |
type | enum (track, album, artist) |
Table: attribute_tags
Column | Type |
--------------------------------+-----------------------------+
id | integer |
attribute_tag_group_id | integer |
name | character varying(255) |
Table: track_attribute_tags
Column | Type |
------------+-----------------------------+
track_id | integer |
tag_id | integer |
Table: artist_attribute_tags
Column | Type |
------------+-----------------------------+
artist_id | integer |
tag_id | integer |
Table: album_attribute_tags
Column | Type |
------------+-----------------------------+
album_id | integer |
tag_id | integer |
Table: artists
Column | Type |
------------+-----------------------------+
id | integer |
name | varchar(350) |
Table: albums
Column | Type |
------------+-----------------------------+
id | integer |
artist_id | integer |
name | varchar(300) |
Table: tracks
Column | Type |
-------------+-----------------------------+
id | integer |
artist_id | integer |
album_id | integer |
compilation | boolean |
name | varchar(300) |
编辑我使用PHP,我不是反对这样做脚本任何排序或其他hijinx,我的#1关心的是回报的速度。
为什么不包含全部* show create table * s和您当前的查询供我们使用? –
MySQL或PostgreSQL?如果前者如果存在使用后者的良好解决方案,则可能转而使用后者? –
@Denis - MySQL。切换到DBMS不是此时的选项。 –