アーティスト、アルバム、トラックの大規模なデータベースがあります。これらの各アイテムには、接着剤テーブル(track_attributes、album_attributes、artist_attributes)を介して割り当てられた1つ以上のタグがあります。各アイテムタイプに適用できるタグは数千(または10万)あります。
私は2つのタスクを実行しようとしていますが、クエリを適切に実行するのに非常に苦労しています。
タスク1)特定のタグ(提供されている場合)のあるアルバムで、特定のタグ(提供されている場合)を持つアーティストによって、特定のタグ(提供されている場合)を持つすべてのトラックを取得します。タグのセットは存在しない可能性があります(つまり、トラックタグのみがアクティブで、アーティストまたはアルバムタグはありません)
バリエーション:結果は、トラックではなく、アーティストまたはアルバムごとに表示することもできます
タスク2)前のフィルターの結果に適用されるタグのリストと、それぞれにタグが付けられているトラックの数を取得します。
私が求めているのは、アプローチの一般的なガイダンスです。一時テーブル、内部結合、IN()を試しましたが、これまでのすべての努力の結果、応答が遅くなりました。私が求めている結果の良い例はここで見ることができます:http ://www.yachtworld.com/core/listing/advancedSearch.jsp、タグの層が1つしかないことを除いて、私は3つを扱っています。
テーブル構造:
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を実行することに反対していません。私の一番の関心事は、戻りの速度です。