Как подходить к сложным круговым отношениям между моделями?

Я пытаюсь создать базу данных для своих медиафайлов, но не могу найти способ перевести данные в модели и полезные, но не избыточные отношения.

На стороне СМИ есть фото и видео в качестве моделей.

     class Photo(MediaFile):
        file = UniqueNameImageField(upload_to="photos/")
        preview = UniqueNameImageField(upload_to="previews/", blank=True)
        thumbnail = models.ImageField(upload_to="thumbnails/", blank=True)
        mediatype = "photo"
        
    class Video(MediaFile):
        file = UniqueNameFileField(upload_to="videos/")
        preview = UniqueNameFileField(upload_to="previews/", blank=True)    
        thumbnail = models.ImageField(upload_to="thumbnails/", blank=True)
        mediatype = "video"
...

В качестве метаданных я хочу хранить персоны, цитаты и релизы (контракты с появляющимся человеком).

class Person(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField(null=True, blank=True)
    city = models.CharField(max_length=255, blank=True)
    district = models.CharField(max_length=255, blank=True)
    occupation = models.CharField(max_length=255, blank=True)

    def __str__(self):
        return " ".join([self.name, "("+str(self.age)+")", self.city])
    
class Release(models.Model):
    person =  models.ForeignKey("Person", on_delete=models.PROTECT)
    file = models.FileField(upload_to="release_docs/")
        
class Quote(models.Model):
    person =  models.ForeignKey("Person", on_delete=models.PROTECT)
    #alternative by-line if it should not be name+age
    alt_by = models.CharField(max_length=255)
    text = models.TextField()

Каждый релиз должен быть связан с человеком. Каждая цитата должна быть привязана к человеку.

Но тогда каждое лицо, релиз и цитата будут привязаны к фотографиям и видео.

Сложность заключается в следующем: Не каждый релиз считается для каждой фотографии человека, а скорее только для определенного набора фотографий и видео.

Кроме того, цитаты не относятся к каждой фотографии и видео, на которых появляется человек, а скорее к тем, которые относятся к тому дню, когда человек был процитирован.

Это привело бы меня к тому, чтобы установить many2many отношения между релизами и фото/видео, а также many2many отношения между людьми и фото/видео, а также many2many отношения между цитатами и фото/видео...

Сейчас существует много дублирования, поскольку если релиз привязан к фотографии, то он уже содержит связь с человеком. Однако объект персоны нуждается в отдельной связи с той же фотографией.

Кроче говоря, все связано со всем, но это приводит к дублированию и, возможно, противоречивой информации в БД.

Я ищу здесь не решение этого случая, а скорее указатель в правильном направлении, как работать с такими отношениями или упростить их. Наверняка это не такая уж редкость. Как к этому подойти / на какое ключевое слово обратить внимание?

Благодарим вас за помощь.

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