配列フィールドを使用する場合
- DBの各行のサイズは少し大きくなるため、Postgresはより多くのトーストテーブルを使用することになります( http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- 特に
defer
を使用しない限り、行を取得するたびに ( https://docs.djangoproject.com/en/1.9 / ref / models / querysets /#defer )フィールド、またはonly
を介してクエリから除外します 、またはvalues
または何か、あなたはその行を反復するたびにそれらすべての値をロードするコストを支払います。それが必要な場合は、そうしてください。 - その配列の値に基づいてフィルタリングすることは可能ではありませんが、Django ORMは、M2Mテーブルの場合ほど明確にはなりません。
M2Mを使用する場合
- これらの関連する値をより簡単にフィルタリングできます
- これらのフィールドはデフォルトで延期されます。
prefetch_related
を使用できます それらが必要な場合は、それらの値のサブセットのみをロードしたい場合は空想になります - キーと追加のIDフィールドがあるため、M2Mを使用するとDBの合計ストレージがわずかに増加します
- この場合の結合のコストは、キーがあるため完全に無視できます。
個人的にはM2Mテーブルを使用すると思いますが、特定のアプリケーションはわかりません。大量のデータを処理する場合は、代表的なデータセットを取得して、両方の方法をテストする価値があります。