0

私は本を​​評価するためのウェブサイトを書いていますが、ログに記録されたユーザーに投票システムを実装する方法がわかりません。ユーザーは1から10までの本を評価できる必要があります。もちろん、システムは自分の投票を記憶し、すべての投票をカウントし、平均レートを計算する必要があります。

私が次のモデルを持っているとしましょう:

class Book(models.Model):
    title = models.CharField(max_length=30)
    author = models.ForeignField(Author)
    #... other fields

class User(models.Model):
   first_name = models.CharField(max_length=50)
   last_name = models.CharField(max_length=30)
   #... other fields

これで、rateフィールドとrates_countフィールドをBookに追加できますが、ユーザーの投票を覚えておく必要があります。明らかに、BookクラスにManyToManyフィールドが必要ですが、そのようなもので十分だと思います。

class Vote(models.Model):
   user_who_voted = models.ForeignField(User)
   rated_book = models.ForeignField(Book)
   rate_date = models.DateField()
   rate = models.ForeignField(User)

class Book(models.Model):
    title = models.CharField(max_length=30)
    author = models.ForeignField(Author)
    votes = models.ManyToManyField(through='Vote')
    #... other fields

Bookクラスにrateとrates_countが必要かどうか疑問に思います。投票モデルから値を計算できるからです。ここに私にとって未知のものがいくつかあります:

データベースエンジン、たとえばPostgreSQLが、選択した本の平均レートをカウントする速度(すべての投票の投票を追加してカウントする[平均レート=追加されたすべての投票/投票数])、10000票の場合、および1000000票の場合。稼働時間は一定になりますか?PCをサーバーの1000倍遅い場合、コンピューティングに必要な時間も直線的になりますか?

私の質問がばかげているなら申し訳ありませんが、私はデータベースプログラミングの経験がありません。ご回答ありがとうございます。

4

1 に答える 1

1

ORM や Django の専門家ではありませんが、ほとんどの SQL データベースには非常に高速に計算できる合計があります。評価用の数値フィールドがある場合、計算は非常に簡単かつ迅速で、最大 2 回の DB SQL 呼び出しで完了します (レコード数もカウントする必要があります)。django ORMに合計があるかどうかを確認してください(あると思います)。そうでない場合(django ormも直接SQLを提供していると確信しているため)、レートを計算するためのカスタムSQLクエリを作成する必要がある場合があります。このようなクエリは、必要な書籍 ID をフィルター処理します。

アルゴリズムのスケールアップは簡単ではありません。いくつかのモデル(およびおそらく代替モデル)があれば、モデルに関する質問とパフォーマンスに関する質問を分割する必要があると思います

于 2012-09-13T20:44:02.943 に答える