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