如何处理数据库中的大量重复数据?

How to deal with lots of duplicated data in DB?

我目前正在为一个摄影项目建立一个数据库,我很难决定这个:

大约有 300 万张照片,即使有 1500 万张照片,我也希望它能继续工作。它们存储在磁盘上,并在数据库中具有路径。所有这些都需要一个标题,但标题是高度重复的。平均约有 10 张照片具有完全相同的标题(相同的创作者、相同的标题、相同的日期)。

创建一个模型更好吗?

class Photo(models.Model):
  file = models.FileField()
  headline = models.CharField()
  caption = models.TextField()
  date = models.DateField()
  created_by = models.CharField()

或者我应该制作 2 个模型,即使这意味着当一组中的一张照片后来获得不同的标题时必须手动创建副本?

class Photo(models.Model):
  file = models.FileField()
  metadata = models.ForeignKey('Metadata')

  def set_metadata(self, metadata):
    self.metadata = Metadata.models.get_or_create(metadata) 

class Metadata(models.Model):
  headline = models.CharField()
  caption = models.TextField()
  date = models.DateField()
  created_by = models.CharField()

最常见的任务是根据元数据搜索图片。创建一个额外的模型并将 db table 减少 10 倍是否值得?还是它只是引入了不必要的并发症而对性能没有任何好处?

感谢您的帮助!

这符合数据库规范化(单独模型)与非规范化(同一模型中的冗余数据)。选择哪一个的决定完全取决于业务用例。例如,可能有助于选择合适选项的一些问题:

  • 未来平均照片数量与标题(On Average about 10 photos have exactly the same caption)相比是否会增加?
  • 如果 Caption/Metadata object 与多张照片相关,更改或更新元数据将反映在所有照片上。这是企业的预期行为吗?
  • 是否会为所有图片显示标题?
  • 每张图片都需要标题吗?

您可以快速阅读 https://www.geeksforgeeks.org/denormalization-in-databases/ 上的非规范化,了解其优缺点。鉴于您的 use-case,拥有 2 个模型是更好的选择。尽管将有额外的技术努力来确保 Picture-Caption 关系得到准确维护,但拆分模型设计将是可扩展的,并且有助于将来轻松进行分析。