我正在开发一个应用程序,需要能够将EXIF元数据存储在关系型数据库中。未来我也希望支持XMP和IPTC元数据,但目前我的重点是EXIF。
Stack Overflow上有一些关于存储EXIF元数据时表结构应该如何设计的问题。然而,它们都没有真正解决我的问题。我遇到的问题是不同的EXIF标签具有不同格式的值,并且没有一个列类型可以方便地存储它们所有。
最常见的类型是“有理数”,它是表示分数的两个四字节整数数组。但还有非分数短整数和长整数、ASCII字符串、字节数组和“未定义”(必须根据先验知识解释特定标记的8位类型)。我希望支持所有这些类型,并且希望以方便、高效、无损(即不将有理数转换为浮点数)、可扩展和可搜索的方式实现。
到目前为止,我考虑了以下几种方法:
我的当前解决方案是将所有东西都存储为字符串。这使得存储所有不同类型变得非常容易,也很方便搜索和调试。但是,它有点笨重和低效,因为当我想要实际使用数据时,我必须进行大量的字符串操作,将有理数值转换为它们的分数等价物,例如:
我可以从文件中获取每个值的原始EXIF字节,并将它们存储在blob列中,但是这样我每次都必须重新解释原始字节。这可能比字符串解决方案稍微更高效一些,但在其他方面远远不如 - 总体而言,不值得。
我可以针对每种不同的EXIF数据类型有一个不同的表。使用this pattern,我可以在几个不同的表中存储我的值同时保持我的外键关系。然而,这将使我最常见的查询,即选择给定照片的所有EXIF元数据,变得有点麻烦。当我添加对其他元数据格式的支持时,它也会很快变得难以管理。
我并不是一个数据库专家,所以是否有一些我未掌握的模式或类似联合的列类型可以解决这个问题?或者我只能在以上三个选项中选择其中一种?
Stack Overflow上有一些关于存储EXIF元数据时表结构应该如何设计的问题。然而,它们都没有真正解决我的问题。我遇到的问题是不同的EXIF标签具有不同格式的值,并且没有一个列类型可以方便地存储它们所有。
最常见的类型是“有理数”,它是表示分数的两个四字节整数数组。但还有非分数短整数和长整数、ASCII字符串、字节数组和“未定义”(必须根据先验知识解释特定标记的8位类型)。我希望支持所有这些类型,并且希望以方便、高效、无损(即不将有理数转换为浮点数)、可扩展和可搜索的方式实现。
到目前为止,我考虑了以下几种方法:
我的当前解决方案是将所有东西都存储为字符串。这使得存储所有不同类型变得非常容易,也很方便搜索和调试。但是,它有点笨重和低效,因为当我想要实际使用数据时,我必须进行大量的字符串操作,将有理数值转换为它们的分数等价物,例如:
fraction = float(value.split('/')[0]) / float(value.split('/')[1])
。(在我的实际代码中,它并不像这个杂乱拼凑的一行那样,但是这展示了问题。)我可以从文件中获取每个值的原始EXIF字节,并将它们存储在blob列中,但是这样我每次都必须重新解释原始字节。这可能比字符串解决方案稍微更高效一些,但在其他方面远远不如 - 总体而言,不值得。
我可以针对每种不同的EXIF数据类型有一个不同的表。使用this pattern,我可以在几个不同的表中存储我的值同时保持我的外键关系。然而,这将使我最常见的查询,即选择给定照片的所有EXIF元数据,变得有点麻烦。当我添加对其他元数据格式的支持时,它也会很快变得难以管理。
我并不是一个数据库专家,所以是否有一些我未掌握的模式或类似联合的列类型可以解决这个问题?或者我只能在以上三个选项中选择其中一种?