2009-09-02 32 views
0

私は、私のケースビールでは、複数のアイテムの平均を計算するために、私の頭を適切なデザインの周りに入れようとしています。ウェブサイトのユーザーはさまざまなビールを見直すことができ、すべてのビールにはそのレビューに基づいて評価(そのビールのすべてのレビューの平均)が与えられます。各ビールのレビューには5つの基準があり、それらの基準は重み付けされ、その特定のレビュー(そのユーザーによる)の総合評価に計算されます。計算と平均を得るためのDB設計

ここには、現在存在する関連モデルのいくつかがあります。私の現在の考え方は、あなたが下記のようにすべてのビールのレビューが自分のテーブルにあるということです。

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 

実際の質問は、ビールのすべてのレビューに基づいて全体のビール平均をどのように計算するのですか? Beerモデルでランニングヒットを維持していますか(例:レビュー数と合計点、レビューごとに更新されます)、または平均値をオンザフライで計算していますか?私の現在のdbデザインの方法はマークから外れていますか?

私はトップビールリスト(最高級ビール100点)も計算しますので、これは別の計算で評価します。

ご迷惑をおかけして申し訳ありません。これは私の最初のWebアプリケーションですので、私のnoob-nessを許してください。私はまだデータベースを選択していないので、MYSQLやPostgresSQLが何らかの形で他のものより優れている場合は、あなたの好みを提供してください。私はそれらの2つのDBの間で選択します。私もDjangoを使用しています。ありがとうございました。

答えて

2

Djangoバージョン1.1を使用している限り、必要に応じて新しい集計機能を使用して平均を計算できます。以下のような

何か:

from django.db.models import Avg 
beers_with_ratings = Beer.objects.all().annotate(avg_rating=Avg('beer__overallrating')) 

は今、各ビールのオブジェクトは、それに関連する評価のそれぞれについて、overallratingフィールドの平均であるavg_rating性質を持つことになります。

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

のいずれか、データベースの選択に関してこの種のもののためにまったく問題ありとして:その後、トップ100を取得する

。集約はリレーショナルデータベースの基本機能であり、PostgresとMysqlの両方で問題なく実行できます。

+0

ありがとうございました!私は1.1が最近出てきたことを知っていましたが、私はまだそれと遊んでいませんでした。私は今、正当な理由があるように見えます。 – kfordham281

0

Django ratingsモジュールを見てください。非常にうまく構成され、強力な評価システムを提供します。また、同時に複雑すぎることはありません(これがあなたの最初のウェブアプリなら、やや威圧的かもしれませんが)。 平均などの計算を直接処理する必要はありません。

編集:

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) 

Beerratingモデルのための必要性無し:あなたはジャンゴ・評価を使用している場合は、あなたのmodels.pyは、おそらく次のようになり、もう少し便利

ことができます。代わりにすべてのレーティング情報はdjango-ratingsのVote + Scoreモデルに保存されます。

+0

このプラグイン可能なアプリを使用する利点はありますか? – kfordham281

関連する問題