Django ContentTypes против OneToOneField против структуры с несколькими таблицами - PullRequest
1 голос
/ 05 марта 2012

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

У меня есть модель под названием Activity, в которой хранятся общие данные об активности (даты начала / окончания, теги, заголовок, связанный URL, изображения и т. Д.).

Существует несколько категорий действийкаждый из которых требует разных столбцов.Если бы мне нужно было создать это приложение в Mongo, это было бы легко, я бы просто создал вложенную структуру для конкретной операции со всеми ее уникальными атрибутами.В MySQL это немного сложнее (во всяком случае, для меня).

Пока что я решил использовать фреймворк contenttypes.

    class Activity(models.Model):
        data_source = models.ForeignKey('source.Source')
        venues = models.ManyToManyField('venue.Venue', blank=True, null=True)
        tags = models.ManyToManyField('tag.Tag', blank=True, null=True)
        checkout_url = models.URLField(blank=True, null=True)
        date_available = models.DateTimeField(blank=True, null=True)
        date_expires = models.DateTimeField(blank=True, null=True)
        small_image = models.ImageField(upload_to=settings.ACTIVITY_IMAGE_DIRECTORY, blank=True, null=True)
        big_image = models.ImageField(upload_to=settings.ACTIVITY_IMAGE_DIRECTORY, blank=True, null=True)
        is_active = models.BooleanField(default=True)
        full_title = models.CharField(max_length=150)
        short_title = models.CharField(max_length=75, blank=True, null=True)
        slug = models.SlugField(blank=True)
      # Handle Generic Relations
        content_type = models.ForeignKey(ContentType)
        details_object_id = models.PositiveIntegerField()
        details = generic.GenericForeignKey('content_type', 'details_object_id')

Меня беспокоит то, что яслышал смешанные отзывы о родовых отношениях (коллеги жаловались на то, что запросы иногда бывают медленными и громоздкими). ​​

Вместо этого я полагаю, что я мог бы создать отдельные модели Details для представления уникальных деталей Activity, а затем вернуться кАктивность через OneToOneFields.Тем не менее, я беспокоюсь о том, что несколько типов моделей могут вызвать проблемы с поиском атрибутов.Если бы у меня было две модели, подобные этой:

  class DetailsA(models.Model):
      activity = models.OneToOneField(Activity)
      ....

  class DetailsB(models.Model):
      activity = models.OneToOneField(Activity)
      ...

, вызывающий Activity_instance.detailsB, вызвал бы ошибку AttributeError в случае, если это действие содержит отношение DetailsA, верно?Я мог бы справиться с этим, определив свойство модели, но это казалось бы не идеальным.

Я также мог бы сделать Activity абстрактным классом и наследовать его, но для этого потребовалась бы дополнительная работа ORM при поиске Activity по нескольким категориям.

Мой инстинкт состоит в том, чтобы использовать общие отношения и денормализовать некоторые данные (например, через столбец details_name).Со временем я, вероятно, все равно перенесу большую часть этих данных в денормализованное хранилище NoSQL.

Кажется ли это хорошим выбором?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...