オーディオ ファイル (FLAC、Vorbis、MP3 など) のコレクションのすべてのタグを含むデータベースを構築したいと考えています。私はすでに抽出を整理しました (それは簡単な部分でした) が、それらを含むデータベースを適切に設計する方法について疑問を持っています。
現時点では、単純な 1:m の関係として次のように正規化しています。
file: filename, size, last_modified, …
tags: filename, tag, seq, value
filenameはテーブルfile
の主キーであり、テーブル( filename, tag,
seq )
の主キーですtag
。一部のタグは複数回表示されます。列は、seq
それらの正確な順序を覚えている単なる数字です。
ただし、このような設計では、ファイルに関する意味のある情報を抽出するのが非常に困難になります。たとえば、各トラックのARTIST
, ALBUM
AND
フィールドだけを使用したい場合は、 andテーブルを 3 回結合する必要があります。TITLE
file
tags
SELECT filename, artist.value, album.value, title.value
FROM file
LEFT OUTER JOIN tags artist USING ( filename )
LEFT OUTER JOIN tags album USING ( filename )
LEFT OUTER JOIN tags title USING ( filename );
WHERE
artist.tag = 'ARTIST'
AND album.tag = 'ALBUM'
AND title.tag = 'TITLE';
これが書くのが非常に面倒であるだけでなく、これらすべての結合のために非常に遅いことは疑いの余地がありません。そして、これは単純な例にすぎません。実際、私が最終的に提示したいすべてのクエリは、あたかも大きなテーブルの列として格納されているかのように、必要なすべてのタグをつなぎ合わせます。
タグを正規化せず、FILE
テーブルの列として保持することについてはすでに考えました。ただし、タグの数は非常に多様です。ARTIST
やのようなより標準的なタグのいくつTITLE
かは、存在することがほぼ保証されています。よりあいまいなもののいくつかは、一部のファイルにしかありませんが、それらも使用する必要があります。
私には、間違った方法でやろうとしているように見えます。特に、tags
テーブルは「構造化」されています。この種のデータを処理するためのより良い方法はありますか? 参考までに:私はPostgreSQLを使用しています。
この投稿から、上記の私のスキーマはEAV モデルであることがわかりました。そのため、かなり難しい問題に直面しているようです…</p>