如何设计mysql db,其中一个表应该只与另外两个表中的一个相关?

时间:2015-09-29 14:26:37

标签: database-design django-models

我们假设我有书籍和评论,我也有评论可以与书籍或评论相关,但同时不是两者都有,我应该如何设计我的数据库呢?我想我可以这样做,但随后评论可以与书籍和评论相关......:

class Book(models.Model):
    title = models.CharField(max_length=100)

class Review(models.Model):
    review = models.TextField()

class Comment(models.Model):
    book = models.ForeignKey(null=True)
    review = models.ForeignKey(null=True)

1 个答案:

答案 0 :(得分:0)

嗯,GenericForeignKey是正式的做法,但GenericForeignKey很糟糕。

  

正常的ForeignKey只能“指向”另一个模型,这意味着   如果TaggedItem模型使用ForeignKey,则必须选择   一个且只有一个模型来存储标签。 contenttypes应用程序   提供了一种特殊的字段类型(GenericForeignKey)   这允许关系与任何模型:

是的,不是根据那个描述,但它很糟糕。所以你的方法并不是一个好主意。您有两种不同的方法来强制执行约束。第一个是在数据库级别,并且将是100%万无一失的,即创建一个ON INSERT TRIGGER,它将检查两个字段中的任何一个是否为空。

第二种方法是覆盖模型中的save方法。

def save(self, *args, **kwargs):
    if self.book and self.review:
        raise ValueError('Hey you cant do that')
    else:
        Super(Comment, self).save(*args, **kwargs)