我正试图围绕正确的设计来计算多个项目的平均值,在我的情况下是啤酒。该网站的用户可以查看各种啤酒,并根据这些评论对所有啤酒进行评级(对该啤酒的所有评论的平均值)。每个啤酒评论都有5个评级标准,这些标准是加权的,然后计算为该特定评价的总评分(由该用户)。
以下是目前的一些相关模型。我目前的想法是,所有啤酒评论都将在您自己的表格中,如下所示。
class Beer(models.Model):
name = models.CharField(max_length=200)
brewer = models.ForeignKey(Brewery)
style = models.ForeignKey(Style)
.....
class Beerrating(models.Model):
thebeer = models.ForeignKey(Beer)
theuser = models.ForeignKey(User)
beerstyle = models.ForeignKey(Style)
criteria1 = models.IntegerField
...
criteria5 = models.IntegerField
overallrating = models.DecimalField
我真正的问题是如何根据啤酒的所有评论计算整体啤酒平均值?我是否在啤酒模型中保持运行记录(例如#评论和总积分;每次检查后都会更新)或者我是否只是动态计算平均值?我目前的数据库设计方式是不是很明显?
我还将计算顶级啤酒列表(100个最高级别的啤酒),这是我将对收视率进行的另一项计算。
非常感谢任何帮助。这是我的第一个网络应用程序,所以请原谅我的noob-ness。我还没有选择数据库,所以如果MYSQL或PostgresSQL在某种程度上比另一种更好,请提供您的偏好以及为什么如果您有时间。我会在这两个DB之间做出选择。我也在使用Django。谢谢。
答案 0 :(得分:2)
只要您使用的是Django 1.1版,就可以使用新的聚合功能在需要时计算平均值。
类似的东西:
from django.db.models import Avg
beers_with_ratings = Beer.objects.all().annotate(avg_rating=Avg('beer__overallrating'))
现在每个Beer对象都有一个avg_rating
属性,它是每个关联评级的总体字段的平均值。
然后获得前100名:
beers_with_ratings.order_by('avg_rating')[:100]
关于数据库选择,对于这类事情要么完全正常。聚合是关系数据库的基本功能,Postgres和Mysql都可以毫无问题地完成它。
答案 1 :(得分:0)
您可能需要查看Django ratings模块。它结构非常好,并提供强大的评级系统。并不是同时过于复杂(虽然如果这是你的第一个网络应用程序,它可能看起来有点吓人)。 您不必直接处理平均值等。
编辑:更有帮助
如果你使用django-ratings,你的models.py可能看起来像这样:
class Beer(models.Model):
name = models.CharField(max_length=200)
brewer = models.ForeignKey(Brewery)
style = models.ForeignKey(Style)
.....
criteria1 = RatingField(range=5) # possible rating values, 1-5
...
criteria5 = RatingField(range=5)
不需要啤酒模型。相反,所有评级信息都将存储在django-ratings的投票+分数模型中。