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 (https://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, ellervalueseller 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_relatedom 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.