我正在开发一个应用程序,我需要能够在关系数据库中存储EXIF元数据。在未来,我还想支持XMP和IPTC元数据,但目前我的重点是EXIF。
Stack Overflow上有一些关于存储EXIF元数据时表结构应该是什么样子的问题。但是,它们都没有真正解决我的担忧。我遇到的问题是不同的EXIF标签具有不同格式的值,并且实际上没有一种列类型可以方便地存储它们。
最常见的类型是“有理”,它是两个表示分数的四字节整数的数组。但也有非小数短整数和长整数,ASCII字符串,字节数组和“未定义”(8位类型,必须根据特定标签的先验知识进行解释。)我想支持所有这些类型,我希望以方便,高效,无损(即不将合理性转换为浮点数),可扩展和可搜索的方式这样做。
这是我到目前为止所考虑的内容:
我目前的解决方案是将所有内容存储为字符串。这使得存储所有不同类型变得非常容易,并且还便于搜索和调试。然而,它有点笨重和低效,因为当我想要实际使用数据时,我必须做一堆字符串操作来将有理数值转换为它们的小数等价物,例如fraction = float(value.split('/')[0]) / float(value.split('/')[1])
。 (在我的真实代码中,它实际上并不是一个混乱的单行,但这表明了问题。)
我可以从文件中获取每个值的原始EXIF字节并将它们存储在blob列中,但之后我每次都必须重新解释原始字节。这可能比字符串解决方案略微提高CPU效率,但它在其他方面要差得多 - 总的来说,不值得。
我可以为每种不同的EXIF数据类型设置不同的表。使用this pattern我可以在将我的值存储在几个不同的表中时保持我的外键关系。但是,这将使我最常见的查询,即为给定的照片选择所有EXIF元数据,有点讨厌。当我添加对其他元数据格式的支持时,它也会很快变得难以处理。
我无论如何都不是数据库专家,所以我缺少一些模式或魔法联合风格的列类型会让这个问题消失吗?或者我是不是从上面的三个选项中挑选了我的毒药?
答案 0 :(得分:0)