我正在考虑我的应用程序的架构设计,我不确定我是否正确接近它。
我有一个名为Activity的模型,它存储有关活动的一般数据(开始/结束日期,标签,标题,相关网址,图像等)。
有几类活动,每类都需要不同的列。如果我要在Mongo中构建这个应用程序,那将很容易,我只是为特定的Activity创建了一个嵌套结构及其所有独特属性。在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链接回Activity。但我担心,多种模型类型会引入属性查找问题。如果我有两个这样的模型:
class DetailsA(models.Model):
activity = models.OneToOneField(Activity)
....
class DetailsB(models.Model):
activity = models.OneToOneField(Activity)
...
如果此活动包含DetailsA关系,则调用activity_instance.detailsB会引发AttributeError,对吗?我可以通过定义一个模型属性来处理这个问题,但它似乎不太理想。
我还可以将Activity作为一个抽象类并从中继承,但是在查找多个类别的活动时需要额外的ORM工作。
我的直觉是使用通用关系并对某些数据进行反规范化(即通过details_name列)。随着时间的推移,我可能只是将大量数据转移到非规范化的NoSQL存储中。
这看起来是个不错的选择吗?