将数据存储在不同的表中或使用bool字段

时间:2016-01-27 13:43:51

标签: django database django-models model-inheritance

我有Article

class Article(models.Model):
    """
    Model to keep articles
    """

    ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255, unique=True, db_index=True)
    content = models.TextField()
    summary = models.TextField()
    img_url = models.URLField(max_length=200)
    author = models.CharField(max_length=50, blank=True, null=True)
    sport  = models.ForeignKey('Sport')
    posted_on= models.DateTimeField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return "%s by %s" % (self.title, self.author)

我存储用户喜欢的文章的表格:

class LikedArticle(models.Model):

    """
    Articles that a user wants to read 
    """

    ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article)
    profile = models.ForeignKey(Profile)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

并且不喜欢:

class UnlikedLikedArticle(models.Model):

    """
    Articles that a user does not want to read 
    """

    ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article)
    profile = models.ForeignKey(Profile)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

现在,这两个表都喜欢和不喜欢,在结构上是相同的。 我觉得最好像这样存储它而不是存储一个名为is_liked的bool字段,因为我确切地知道我存储了什么数据。因此,当我知道我只对LikedArticle感兴趣时,我不必查询大量文章。 这是正确的方法吗?我只是感到困惑,因为在结构上它们看起来一样,并且对这种设计感觉不对。

3 个答案:

答案 0 :(得分:1)

我推荐的最佳方法是使用一个表并添加is_liked字段。 (并为此字段添加索引,以便获得高性能查询)

但如果您仍想使用2表的方法,那么您需要修复您的设计。

使用一个包含所有字段的抽象模型,Like和不同的表继承自抽象模型

class ActionOnArticle(Model):

    your fields here.. 

    class Meta:
        abstract = True

class LikedArticle(ActionOnArticle):


class UnLikedArticle(ActionOnArticle):

答案 1 :(得分:1)

我认为is_liked不是一个好的选择,如果你想保存每个配置文件的其他信息,比如:谁喜欢什么,什么时候等等。如果你想丢失这些信息,那么我的建议是使用多对多关系,文章模型将是这样的:

class Article(models.Model):
   """
    Model to keep articles
   """

    ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255, unique=True, db_index=True)
    content = models.TextField()
    summary = models.TextField()
    img_url = models.URLField(max_length=200)
    author = models.CharField(max_length=50, blank=True, null=True)
    sport  = models.ForeignKey('Sport')
    posted_on= models.DateTimeField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    likes = models.ManyToManyField(Profile)
    unlikes = models.ManyToManyField(Profile)

def __unicode__(self):
    return "%s by %s" % (self.title, self.author)

https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/

如果您想保存我回复开头提到的信息,我认为@Eyal答案很好

答案 2 :(得分:0)

我使用" is_liked" BooleanField并对其进行过滤以获取喜欢或不喜欢的文章。对BooleanField进行过滤(在字段选项上添加db_index = True)对于任何体面的数据库来说都非常快,因此即使它们很大,您也不太可能使用单独的表获得显着的性能提升。