2

最初のオープニング: postgresql JSONFields を利用しています。

モデルに次のattribute(フィールド) があります。User

class User(AbstractUser):
   ...
   benefits = JSONField(default=dict())
   ...

私は基本的に現在、DRF を使用してフロントエンドで各ユーザーの特典をシリアル化しています。

    benefits = UserBenefit.objects.filter(user=self)
    serializer = UserBenefitSerializer(benefits, many=True)

UserBenefit.objects.filter(user=user)根底にある返される利点はほとんど変化せず、ゆっくりと変化するため、 QuerySetのパフォーマンスを改善するために、変更があるたびに JSON をデータベースに「キャッシュ」することを考えました。代わりに、user.benefits10 万人以上のユーザーを超える DB 負荷になり、できれば軽減します。


第 1 問:

これを行う必要がありますか?

第 2 四半期:

serializer.data <class 'rest_framework.utils.serializer_helpers.ReturnList'>JSONフィールドに対応するものを効率的に書く方法はありますか?

私は現在使用しています:

data = serializers.serialize("json", UserBenefit.objects.filter(user=self))

4

1 に答える 1

1

最初の質問:

キャッシュの代替手段を使用したくない場合は、悪い考えではありません。

なんらかの変更または...のためにデータベースにクエリを実行する必要があり、ホール リクエストをキャッシュできない場合、JSON オブジェクトを保存するというアイデアは非常に良いアイデアです。この方法では、データのみを取得し、シリアル化のほとんどの部分をスキップし、m2m データを取得するためにピボット テーブルにクエリを実行する必要もなくなります。ただし、この方法では、大量の余分なデータを行に追加していることに注意してください。ほとんどの場合、それらが必要になる場合を除き、実際には必要のない余分なデータを取得することができます。クエリセットで関数を使用してvaluesいますが、それでもより多くのコーディングが必要です。基本的に、最初のクエリにより多くの帯域幅を使用し、処理能力の代わりにデータを保存するためにより多くのストレージを使用します。また、ある時点でページネーションがbenefits必要になった場合、ページネーションを実現するのは非常に困難です。

m2m リレーション データの取得は、データベースにあるデータの量にもよりますが、通常は非常に高速ですが、パフォーマンスを向上させる最終的な方法は、リクエストをキャッシュしてデータベース ヒットを可能な限り減らすことです。

おそらくよく耳にするように、テストとベンチマークを行って、要件と制限に応じてどのオプションが実際に最適かを確認する必要があります。スコープ全体と現在のソリューションに関する情報を知らずに最適化方法を提案することは非常に困難です。

2 番目の質問については、次のとおりです。

よく分からないと思います。モデルのフィールドであるJSONオブジェクトを保存している場合User、なぜ必要なのdata = serializers.serialize("json", UserBenefit.objects.filter(user=self))ですか?

シリアライザーは JSON フィールド データを返すだけなので、これは必要ありません。

于 2019-08-16T10:57:36.697 に答える