Как справиться с большим количеством дублирующихся данных в БД?

В настоящее время я создаю базу данных для проекта по фотографии и мне трудно решить следующее:

Имеется около 3 миллионов фотографий, и я хотел бы, чтобы это продолжало работать даже при 15 миллионах. Они хранятся на диске и с путями в БД. Все они нуждаются в подписи, но подписи сильно дублируются. В среднем около 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 в 10 раз? Или это только внесет ненужные усложнения, не дающие выигрыша в производительности?

Спасибо за помощь!

Это соответствует нормализации базы данных (отдельная модель) против денормализации (избыточные данные в одной модели). Решение о выборе того или иного варианта полностью зависит от конкретного случая использования в бизнесе. Например, некоторые вопросы, которые могут помочь в выборе подходящего варианта:

  • Ожидается ли в будущем увеличение среднего количества фотографий, соответствующих надписи (On Average about 10 photos have exactly the same caption)?
  • Если объект Caption/Metadata связан с несколькими фотографиями, изменение или обновление метаданных будет отражено на всех фотографиях. Является ли такое поведение ожидаемым для бизнеса?
  • Будут ли отображаться подписи для всех фотографий?
  • Нужны ли подписи к каждой фотографии?
  • Вы можете быстро прочитать о денормализации на https://www.geeksforgeeks.org/denormalization-in-databases/, чтобы понять ее плюсы и минусы. Учитывая ваш случай использования, наличие двух моделей является лучшим вариантом. Хотя потребуются дополнительные технические усилия для обеспечения точного поддержания связи "картинка-картинка", дизайн разделенной модели будет масштабируемым и может помочь в легком анализе в будущем.

Вернуться на верх