我想建立一个数据库,其中包含一组音频文件(FLAC、Vorbis、MP3 等)的所有标签。我已经对提取进行了整理(这是最简单的部分),但现在我对如何正确设计包含它们的数据库有些疑问。
目前,我已将其标准化为简单的 1:m 关系:
file: filename, size, last_modified, …
tags: filename, tag, seq, value
其中文件名是file
表( filename, tag,
seq )
的主键和表的主键tag
。有些标签确实出现了不止一次;该seq
列只是一个数字,可以记住它们的确切顺序。
然而,通过这样的设计,提取有关文件的有意义的信息变得非常痛苦。例如,如果我只想为每个轨道设置ARTIST
, ALBUM
AND
TITLE
字段,我已经必须加入file
andtags
表三次:
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。