【问题标题】:Django: storing/querying a dictionary-like data set?Django:存储/查询类似字典的数据集?
【发布时间】:2014-09-01 12:39:47
【问题描述】:

如果已经有人问过这个问题,或者在其他地方回答了这个问题,我深表歉意。

无论如何,我正在开发一个项目,简而言之,它存储图像元数据,然后允许用户搜索所述元数据(类似于一长串键值对)。如果元数据是标准化的,这不会是太大的问题。但是,问题在于,对于数据库中的任何给定图像,其元数据中都有任意数量的键/值。也没有标准的键列表。

基本上,我需要找到一种方法来为每个模型存储一个字典,但可以使用任意键/值对。我需要能够查询它们。我工作的组织正计划将数千张图像上传到这个程序,所以它必须相当快地查询。

我的数据库中有一个模型,一个图像模型,带有filefield

所以,我介于两个选项之间,我真的可以从有更多经验的人那里获得一些帮助来选择最好的一个(或任何其他效果更好的解决方案)

  1. 使用像MySql这样的传统关系型数据库,用foreignkey对图像模型、键字段和值字段创建一个单独的模型。然后,当我需要查询数据时,我会询问与图像相关的这个单独表的每个实例,然后在这些行中查询我需要的键/值组合。

  2. 使用 MongoDB 之类的东西,使用 django-toolbox 及其 DictField 来存储元数据。然后,当我需要查询时,我将访问 dict 并在其中搜索我需要的键/值组合。

虽然我觉得 1 在查询时间方面会好得多,但每张图像可能有多达 40 个元数据键/值,这让我担心那个单独的“字典”表如果有成千上万的图像,则变得太大。

任何建议将不胜感激。谢谢!

【问题讨论】:

标签: python mysql django mongodb database


【解决方案1】:

元数据的类型是什么?键和值都是字符串?我猜是这样的。

数据集的规模很重要。如果您将拥有多达数千个图像并且每个图像具有多达 40 个键值对,那么在选项 1 中,单独的表将最多具有 400k 条记录。这对于现代数据库来说没问题,只要你没有坏机器和正确的数据库设置。要注意的一个问题是在表中组合索引字段。在 Django ORM 中,它会是这样的:

class ImageMeta(models.Model):
    image = models.ForeignKey('Image')
    key = models.CharField(max_length=XXXX)
    value = models.CharField(max_length=XXXX)
    class Meta:
        index_together = [ ["image", "key", "value"], ]     # Django 1.5 and above

【讨论】:

    【解决方案2】:

    在一个 Django 项目中,你有 4 种替代方案来解决这类问题,没有特别的顺序:

    • 使用 PostgreSQL,你可以使用 hstore 字段类型,这基本上是一个腌制的 Python 字典。它在查询方面不是很有帮助,但它可以保存您的数据。

    • 将 Django-NoRel 与 mongodb 一起使用,您将获得 ListField 字段类型,它执行相同的操作,并且可以像 mongo 中的任何内容一样进行查询。 (选项 2)

    • 使用 Django-eav 使用您的数据创建实体属性值存储。优雅的解决方案,但查询速度非常慢。 (选项 1)

    • 将您的数据作为 json 字符串存储在足够长的 TextField 中,并创建您自己的函数来序列化和反序列化数据,而无需考虑能够对其进行查询。

    根据我自己的经验,如果您有任何机会需要查询数据,您的选项二是迄今为止最好的选择。 Django 中的 EAV,没有复合键,很痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 2015-11-28
      • 2011-07-18
      • 2023-03-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多