【问题标题】:Is there a better way to store who likes, dislikes a profile in a relational database?有没有更好的方法来存储谁喜欢,不喜欢关系数据库中的个人资料?
【发布时间】:2017-05-11 19:22:08
【问题描述】:

我正在创建一个小型 django 应用程序,用户可以在其中查看他或她的个人资料上的喜欢和不喜欢的数量以及喜欢或不喜欢该个人资料的人。

我的 django 模型是:

class ProfileView(TimeStamp):
    PROFILE_RESPONSE = (
        (0, 'Like'),
        (1, 'dislike'),
    )

    user_from = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

    user_to = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='views',
    )
    response = models.IntegerField(choices=PROFILE_RESPONSE)

在此表中,我将喜欢/不喜欢个人资料的人存储在 user_from 中,以及他喜欢/不喜欢的人在 user_to 中。回复user_from 喜欢或不喜欢user_to(0 表示喜欢,1 表示不喜欢)

但是这种解决方案不可扩展,并且像列出所有喜欢或不喜欢特定个人资料的用户这样的查询效率很低。那么,在关系数据库中还有比这更好的选择吗?注意,我正在使用 postgresql。

【问题讨论】:

  • 你知道聚合吗?这可能在这里有用。 docs.djangoproject.com/en/1.10/topics/db/aggregation 否则,您可以在配置文件模型中添加四个新 (int) 字段来计算自己和配置文件的好恶。
  • 感谢聚合链接,但添加四个字段将无济于事,因为我还必须存储喜欢特定喜欢的用户。
  • 你能写出实际的代码吗?我无法理解您所说的“user_from | user_to | response(0,1)”是什么意思。
  • 我想说的是,假设有一个用户 A,用户 B 和 C 喜欢并且 D 不喜欢 A 的个人资料。现在很容易存储 A 的喜欢和不喜欢计数,但我还想存储 B、C 和 D 的他们喜欢或不喜欢 A 的个人资料的信息,以便用户 A 可以看到谁喜欢他的个人资料。

标签: django database postgresql


【解决方案1】:

即使对于相当多的用户(数百万),只要您定期(例如每晚一次)汇总结果,此模型也可以扩展。您基本上需要定期重新计算以下模型:

from django.db import models

class UserLikeSummary(models.Model):
    user = models.ForeignKey(UserLike) # `ProfileView` didn't look like a model at first glance since it subclassed from `Timestamp`
    like_count = models.IntegerField(default=0)
    dislike_count = models.IntegerField(default=0)

您也可以只创建一个数据库视图,通过如下查询为您保留正在运行的汇总总数的标签:

select user_to_id, count(id) 
  from appname_userlike 
  where response=0 
  group by user_to_id; 
-- this will keep tabs on likes, and you can have a similar query/view for dislikes

在django中,可以这样写:

UserLike.objects.filter(
    response=0
).values('user_to_id').annotate(d_count=Count('id'))

只要user_to 是索引列,它就会运行得相当快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多