我想建立一个包含音频集合的所有标签的数据库 文件(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';
毫无疑问,这不仅写起来极其麻烦,而且 由于所有这些连接,它也很慢。而这只是一个简单的 例子。实际上,我最终想要提出的所有查询都会被拼凑 将他们需要的所有标签放在一起,就好像它们被存储为 大 table 。
我已经考虑过不对标签进行规范化,只是将它们保留为
FILE
表的列。但是标签的数量变化很大;一些
ARTIST
和 TITLE
等更标准的标签几乎可以保证
目前,一些比较晦涩的只是在一些文件上,但我需要
也可以和他们一起工作。
对我来说,我似乎在尝试以错误的方式进行操作,尤其是 tags
表是“结构化的”。有没有更好的方法来处理这种数据?
供引用:我正在使用 PostgreSQL。
最佳答案
But the number of tags is highly variable; some of the more standard tags like ARTIST and TITLE are almost guaranteed to be present, some of the more obscure ones are only on some of the files, but I need to work with them too.
您可以为(大部分)保证标签使用单独的表格,并为可选标签使用 EAV 模型。
关系数据库旨在连接表。在您真正遇到性能问题之前,不要担心连接的性能问题。担心您的数据关系是否正确。
关于postgresql - 设计用于存储音频文件标签的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189329/