Я размышляю над дизайном схемы моего приложения и не уверен, что подхожу к нему правильно.
У меня есть модель под названием 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.
Кажется ли это хорошим выбором?