6

そしてあけましておめでとうございます!

数十万のレコードを保持するモデルがあります。モデルは次のようになります。

class Transaction(models.Model):
    user = models.ForeignKey(User)
    client = models.ForeignKey(Client)
    amount = models.FloatField()

特定のユーザーが扱っているすべてのクライアントを知りたいです。一意のクライアント ID を取得するには、Django ORM を単独で使用できます。

Transaction.objects.filter(user=the_user).distinct('client_id').values_list('client_id', flat=True)

または、次の操作を行います。

set(Transaction.objects.filter(user=the_user).values_list('client_id', flat=True))

どちらも同じ結果になります。しかし、大量の記録を考えると、どちらが速いでしょうか? distinctデータベースでの操作が比較的遅いことは知っていますが、pythonの操作と比較してどうset()ですか?

最後に、データベースについて言えば、私の選択肢は本番用の MySql と PostgreSql です。この特定の操作について、2 つの間に違いはありますか?

4

1 に答える 1

10

私は通常 orm 関数を使用します。読みやすく、データベース レベルで実行されます。RDBMS が実際に個別の値を計算し、1 つのステップで結果が得られます。

Python セットでも同じことができますが、最初にすべてのデータ セットを取得してから、set() を適用する必要があります。したがって、同じことを行うには、2 段階の操作を実行する必要があります。

最初のケース (orm) では I/O オーバーヘッドのみがあり、2 番目のケースでは I/O オーバーヘッド + 関数呼び出しがあるため、ORM の個別のものを使用します。

于 2013-01-02T03:59:45.077 に答える