【发布时间】:2012-12-20 18:59:46
【问题描述】:
我想建立一个数据库,其中包含音频集合的所有标签 文件(FLAC、Vorbis、MP3 等)。我已经整理好提取了 (那是容易的部分),但现在我对如何正确 设计包含它们的数据库。
目前我已将其标准化为这样 作为一个简单的 1:m 关系:
file: filename, size, last_modified, …
tags: filename, tag, seq, value
其中 filename 是file 表的主键,( filename, tag,
seq ) 是tag 表的主键。有些标签确实出现了不止一次;
seq 列只是一个数字,可以记住它们的确切顺序。
但是,通过这样的设计,可以提取有关
文件成为真正的痛苦。如果我例如只想拥有ARTIST、ALBUM 和
每个轨道的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。
【问题讨论】:
标签: postgresql database-design normalization