【问题标题】:implementing like system in django and postgres在 django 和 postgres 中实现类似的系统
【发布时间】:2020-03-18 09:39:23
【问题描述】:

我想为我们的项目实现一个类似的系统,我的问题几乎是关于性能的,我想将 django 与 Postgresql DB 一起使用,在 models.py 中我有一个 Like 模型:

class Like(models.Model):
    user    = models.ForeignKey(User,on_delete=models.CASCADE,related_name = "like")
    place   = models.ForeignKey(Places,on_delete=models.CASCADE,related_name = "likedPlace")

当用户想要查看帖子时,我应该向他们展示他/她是否喜欢该帖子,postgresql 是否适合此目的?或任何其他关系数据库?如果我有 50000 个用户并且每个用户喜欢 10 个帖子,每次我应该在最坏的情况下迭代 500000 行。 我可以为此目的使用像 cassendra 这样的 nosql 数据库吗?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    我不完全知道 django 对这个模型做了什么(我不使用任何 ORM)。但如果我理解正确,它会在用户和地点之间建立一个关联表,用户表示他们喜欢这个地点。如果是这样,这可以通过单个查询和 NO 迭代 来解决。如前所述,我无法为它编写 django 模型/查询,但我给出了一个 SQL 来完成它,你应该能够翻译。以下允许用户指示喜欢或不喜欢,并处理未指示的情况。

    select case when exists (select like_dislike
                               from user_likes ul  
                              where ul.user_id  = &user_id_in
                                and ul.place_id = &place_id_in
                            )
                then (select like_dislike
                        from user_likes ul  
                       where ul.user_id  = &user_id_in
                         and ul.place_id = &place_id_in
                     )
                else 'Like/Dislike not set' 
            end "Like/Dislike";
    

    这也可以很容易地转换为返回相同字符串的 Postgres SQL 函数。

    create or replace function User_Likes_Fnc( user_id_in  integer
                                             , place_id_in integer
                                             )
      returns text
      language sql
    as  $$
    select case when exists (select like_dislike
                               from user_likes ul  
                              where ul.user_id = user_id_in
                                and ul.place_id = place_id_in
                            )
                then (select like_dislike
                        from user_likes ul  
                       where ul.user_id = user_id_in
                         and ul.place_id = place_id_in
                     )
                else 'Like/Dislike not set' 
            end "Like/Dislike";
    $$;  
    

    希望这会有所帮助,但无论您决定什么,都不要在绝对没有必要时迭代超过 500000 行。

    【讨论】:

    • 谢谢你的回答,我所说的迭代是数据库行为,如果最后一个喜欢某个地方的用户想看看他是否喜欢那个特定的地方,并且我将类似的对象保存在第 50000 行,数据库应该迭代所有其他行来找到这个?或者我误解了这种行为?你现在如何 nosql 数据库处理这种情况?
    猜你喜欢
    • 2014-06-10
    • 2018-09-27
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多