私は、アーティスト、アルバム、トラックの大きなデータベースを持っています。これらの各アイテムには、グルーテーブル(track_attributes、album_attributes、artist_attributes)を介して割り当てられた1つ以上のタグがあります。各項目タイプには数千(または数十万)のタグが適用されます。高性能多層タグのフィルタリング
私は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) |
EDIT私はPHPを使用しています、と私は、スクリプト内の任意の並べ替えや他のhijinxを行うには反対しておりません、私の#1の懸念は、戻りの速さです。
私たちが作業するための完全な* show create table *とあなたの現在の質問を含めないのはなぜですか? –
MySQLまたはPostgreSQL?前者の場合、後者を使用する良い解決策が存在する場合、後者への切り替えが選択肢になる可能性がありますか? @Denis - MySQL。 –
この時点でDBMSへの切り替えはオプションではありません。 –