计算和数据库设计获得平均值

时间:2009-09-02 16:44:33

标签: mysql django postgresql

我正试图围绕正确的设计来计算多个项目的平均值,在我的情况下是啤酒。该网站的用户可以查看各种啤酒,并根据这些评论对所有啤酒进行评级(对该啤酒的所有评论的平均值)。每个啤酒评论都有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。谢谢。

2 个答案:

答案 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的投票+分数模型中。