postgresql - 设计用于存储音频文件标签的数据库

标签 postgresql database-design normalization

我想建立一个包含音频集合的所有标签的数据库 文件(FLAC、Vorbis、MP3 等)。我已经整理好了提取 (那是容易的部分),但现在我对如何正确地 设计将包含它们的数据库。

目前我已经这样规范化了 作为简单的 1:m 关系:

file: filename, size, last_modified, …
tags: filename, tag, seq, value

filenamefile 表的主键,( filename, tag, seq ) tag 表的主键。有些标签确实出现了不止一次; seq 列只是一个数字,它会记住这些的确切顺序。

但是,通过这样的设计提取关于 文件变得非常痛苦。如果我例如只想拥有 ARTISTALBUM 和 每个轨道的 TITLE 字段我已经必须加入 filetags 表 三遍:

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 表的列。但是标签的数量变化很大;一些 ARTISTTITLE 等更标准的标签几乎可以保证 目前,一些比较晦涩的只是在一些文件上,但我需要 也可以和他们一起工作。

对我来说,我似乎在尝试以错误的方式进行操作,尤其是 tags 表是“结构化的”。有没有更好的方法来处理这种数据? 供引用:我正在使用 PostgreSQL。

我收集自 this post我上面的架构是 EAV model , 所以看起来我要解决一个相当困难的问题......

最佳答案

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/

相关文章:

postgresql - 为什么 char 数据类型会自动转换为 bpchar?

python - 构建用于分类/描述产品的应用程序 - 在计划和执行之间不知所措

sorting - 优化redis排序集内存使用

python - 不同长度的 tf-idf 文档

php - 我应该在此处使用表格还是在配置文件中使用硬编码值?

PostgreSQL 9.3 : STUFF and CHARINDEX function

sql - Rails has_and_belongs_to_many 找到共同的唯一对象

php - 从 Postgres 正则表达式替换 PHP 语言中的匹配

mysql - 扩展表(一对一关系)

javascript - 具有如此广泛的值范围的 LSTM 模型(使用 Tensorflow)标准化数据的最佳方法是什么?