Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 求平均值的计算与数据库设计_Mysql_Django_Postgresql - Fatal编程技术网

Mysql 求平均值的计算与数据库设计

Mysql 求平均值的计算与数据库设计,mysql,django,postgresql,Mysql,Django,Postgresql,我正试图用正确的设计来计算多个项目的平均值,以我的啤酒为例。该网站的用户可以查看各种啤酒,并根据这些评论对所有啤酒进行评级(该啤酒所有评论的平均值)。每个啤酒评论都有5个评分标准,对这些标准进行加权,然后(由该用户)计算出该特定评论的总体评分 以下是目前的一些相关模型。我现在的想法是,所有的啤酒评论都会在他们自己的表格中,就像你在下面看到的那样 class Beer(models.Model): name = models.CharField(max_length=200) br

我正试图用正确的设计来计算多个项目的平均值,以我的啤酒为例。该网站的用户可以查看各种啤酒,并根据这些评论对所有啤酒进行评级(该啤酒所有评论的平均值)。每个啤酒评论都有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
我真正的问题是,如何根据对啤酒的所有评价来计算啤酒的总体平均值?我是否在啤酒模型中保持连续计数(例如#评论和总分;每次评论后都会更新),还是只计算动态平均值?我目前的db设计是否有偏差

我还将计算排名靠前的啤酒列表(100种最高评级的啤酒),所以这是我将对评级进行的另一个计算


非常感谢您的帮助。这是我的第一个网络应用,请原谅我的愚蠢。我还没有选择数据库,所以如果MYSQL或PostgresSQL在某些方面优于其他数据库,请提供您的偏好,如果您有时间的话,可能还需要说明原因。我将在这两个数据库中进行选择。我也在用Django。谢谢。

只要您使用的是Django 1.1版,您就可以随时使用新的聚合功能来计算平均值

比如:

from django.db.models import Avg
beers_with_ratings = Beer.objects.all().annotate(avg_rating=Avg('beer__overallrating'))
现在,每个啤酒对象将有一个
avg_rating
属性,该属性是其每个相关评级的总体评级字段的平均值

然后,要进入前100名:

beers_with_ratings.order_by('avg_rating')[:100]

至于数据库的选择,这两种方法都非常适合这种情况。聚合是关系数据库的一个基本功能,Postgres和Mysql都可以做到这一点。

您可能想看看这个模块。它的结构非常好,提供了一个强大的评级系统。同时也不要过于复杂(尽管如果这是你的第一个web应用,它可能看起来有点吓人)。 你不必直接计算平均数等

编辑:更有用一点

如果使用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的Vote+Score模型中。

谢谢您提供的信息!我知道1.1最近推出了,但我还没有玩过。看起来我现在有了一个很好的理由。使用这个可插拔的应用程序比“手动”构建它有什么优势吗?