Om du använder ett matrisfält
- Storleken på varje rad i din DB kommer att bli lite stor, så Postgres kommer att använda mycket fler toastbord (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- Varje gång du får raden, om du inte specifikt använder
defer
(https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) fältet eller på annat sätt exkludera det från frågan viaonly
, ellervalues
eller något, du betalar kostnaden för att ladda alla dessa värden varje gång du itererar över den raden. Om det är vad du behöver så är det så. - Filtrering baserat på värden i den arrayen, även om det är möjligt kommer inte att vara lika trevligt och Django ORM gör det inte lika självklart som det gör för M2M-tabeller.
Om du använder M2M
- Du kan enklare filtrera på dessa relaterade värden
- Dessa fält skjuts upp som standard, du kan använda
prefetch_related
om du behöver dem och sedan bli fancy om du bara vill ha en delmängd av dessa värden laddade - Total lagring i DB kommer att bli något högre med M2M på grund av nycklar och extra id-fält
- Kostnaden för kopplingarna i det här fallet är helt försumbar på grund av nycklar.
Personligen skulle jag säga gå med M2M-tabellerna, men jag vet inte din specifika tillämpning. Om du ska arbeta med en enorm mängd data är det sannolikt värt att ta tag i en representativ datauppsättning och testa båda metoderna med den.