Django ContentTypes与OneToOneField对比多表结构

时间:2012-03-05 02:50:48

标签: mysql django schema

我正在考虑我的应用程序的架构设计,我不确定我是否正确接近它。

我有一个名为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存储中。

这看起来是个不错的选择吗?

0 个答案:

没有答案