是否有更好的方式来存储谁喜欢,不喜欢关系数据库中的个人资料?

时间:2016-12-27 13:41:37

标签: django database postgresql

我正在创建一个小型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表示不喜欢)

但是这个解决方案不具备可扩展性,并且像列出所有喜欢或不喜欢特定配置文件的用户这样的查询效率会非常低。那么,在关系数据库中有没有比这更好的选择。 n.b.,我正在使用postgresql。

1 个答案:

答案 0 :(得分:0)

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

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是索引列,它就会运行得相当快。