我有一个包含艺术家、专辑和曲目的大型数据库。这些项目中的每一个都可以通过粘合表(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,我的第一个问题是返回速度。