2

投稿の賛成票/反対票を計算するには、次の 2 つの戦略のどちらが適しているでしょうか。

これらはモデル フィールドです。

ups
downs
total

def save(self, *args, **kwargs): # Grab total value when needed
    self.total = self.ups - self.downs
    super.(yourmodel, self).save(*args, **kwargs)

対:

ups
downs

def total(ups, downs): # totals will just be computed when needed
    return ups - downs # versus saved as a column

本当に違いはありますか?スピード?スタイル?

ありがとう

4

2 に答える 2

4

私なら後者にします。一般に、計算に時間がかかる場合を除き、他のデータから派生できるデータをデータベースに格納することはありません。この場合、それは簡単な計算です。その理由は、派生データを保存すると、一貫性エラーが発生する可能性があるためです。

クラスインスタンスでも同じことを行うことに注意してください。totalプロパティにすることができれば、保存する必要はありません。変数が少ないということは、エラーの余地が少ないことを意味します。

于 2012-09-23T19:43:55.387 に答える
1

@Caludiuに完全に同意します。私は 2 番目のアプローチを採用しますが、いつものように長所と短所があります。

最初のアプローチは無害に思えますが、将来的に頭を悩ませる可能性があります。アプリケーションの進化について考えてみましょう。モデルの値からさらに計算を導き出したい場合はどうすればよいでしょうか? 一貫性を保ちたい場合は、それらもデータベースに保存する必要があり、多くの「重複した」情報を保存することになります。モデルから派生したテーブルは正規化されず、不必要に大きくなるだけでなく、一貫性エラーの可能性が高くなります。

一方、2 番目の方法を使用する場合、データベースの設計に問題はありませんが、必要な情報を取得するために多くの計算を行う必要があるため、多くの困難な django クエリに陥る可能性があります。これらの種類の計算は、オブジェクト メソッド (または好みに応じてメッセージ) としては非常に簡単ですが、このようなクエリを django スタイルで実行したい場合は、何かが複雑になることがわかります。

繰り返しますが、私の意見では、2 番目のアプローチを採用する必要があります。しかし、あなたのニーズにより適していると思う決定を下すのはあなた次第です...

それが役に立てば幸い!

于 2012-09-23T19:56:10.137 に答える