首页 > 解决方案 > Django Like 机制。数据库性能问题

问题描述

我有 CustomUser 模型和 Post 模型。我考虑在帖子中添加类似轻量级的机制。

我想到的是以这种方式定义一个 Like 模型以将模型相互连接:

class LikeFeedback(models.Model):
   likingUser = models.ForeignKey(CustomUser)
   post_liked = models.ManyToManyField(Post)

但是这种设计在数据库中产生了一个新的行,每个like。


另一种选择是以以下方式定义 CustomUser 和 Post 模型:

class Post(models.Model):
   ... 
   users_liked = models.ManyToManyField(CustomUser)

class CustomUser(models.Model):
   ... 
   posts_liked = models.ManyToManyField(Post)

我不确定这种方法是创建新行还是使用不同的索引机制,但它看起来更整洁。

就数据库性能而言,哪种方法最快?我是否需要在两个模型中定义 ManyToMany 连接以加快数据库进程?因为要在网页上一次显示 15 个帖子,并且每个帖子都需要检查访问者是否已经喜欢该注释。此外,每次点赞和取回都会在 DB 上执行写入操作。

标签: pythondjangodatabaseperformancemany-to-many

解决方案


我不确定这种方法是创建新行还是使用不同的索引机制,但它看起来更整洁。

AManyToManyField将创建一个名为联结表[wiki]的额外表,其中s 指向您定义 的模型,以及您使用.ForeignKeyManyToManyFieldManyToManyField

此外,您只需要一个 ManyToManyField,否则您将建立两个独立行动的关系。因此,您将其建模为:

from django.conf import settings

class Post(models.Model):
    # ... 
    likes = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='liked_posts'
    )

class CustomUser(models.Model):
    # ... 
    # no ManyToManyField to Post

注意:通常使用settings.AUTH_USER_MODEL[Django-doc]引用用户模型比直接使用User模型 [Django-doc]更好。有关更多信息,您可以查看文档的引用User模型部分


推荐阅读