2012-10-18 59 views
0

我正在研究需要将EXIF元数据存储在关系数据库中的应用程序。将来我也想支持XMP和IPTC元数据,但目前我的工作重点放在EXIF上。用于在数据库中存储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

这可能是一个非常便宜的解决方案,但我个人只是将json或类似的东西存储在数据库中。

有一种很酷的方式来提取EXIF数据并将其解析为json。

这里是链接:Img2JSON

我希望这种帮助你!

+0

感谢您的建议,但这不是一个可搜索的解决方案,所以与将整个JPEG的EXIF部分作为blob转储到数据库中相比,它没有太多优势。 –