Hvis du bruger et matrixfelt
- Størrelsen af hver række i din DB vil være en smule stor, så Postgres kommer til at bruge meget flere toast-borde (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- Hver gang du får rækken, medmindre du specifikt bruger
defer
(https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) feltet eller på anden måde ekskluder det fra forespørgslen viaonly
ellervalues
eller noget, du betaler prisen for at indlæse alle disse værdier, hver gang du itererer på tværs af den række. Hvis det er det, du har brug for, så må det være sådan. - Filtrering baseret på værdier i det array, selvom det er muligt, vil ikke være så rart, og Django ORM gør det ikke så indlysende, som det gør for M2M-tabeller.
Hvis du bruger M2M
- Du kan lettere filtrere efter disse relaterede værdier
- Disse felter er udskudt som standard, du kan bruge
prefetch_related
hvis du har brug for dem, og bliv så fancy, hvis du kun vil have en delmængde af disse værdier indlæst - Samlet lagerplads i DB vil være lidt højere med M2M på grund af nøgler og ekstra id-felter
- Omkostningerne ved sammenføjningerne er i dette tilfælde fuldstændig ubetydelige på grund af nøgler.
Personligt vil jeg sige, gå med M2M-tabellerne, men jeg kender ikke din specifikke anvendelse. Hvis du skal arbejde med en enorm mængde data, er det sandsynligvis værd at gribe et repræsentativt datasæt og teste begge metoder med det.