Si usa un campo de matriz
- El tamaño de cada fila en su base de datos será un poco grande, por lo que Postgres usará muchas más tablas tostadas (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- Cada vez que obtiene la fila, a menos que use específicamente
defer
(https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) el campo o excluirlo de la consulta a través deonly
, ovalues
o algo así, está pagando el costo de cargar todos esos valores cada vez que itera en esa fila. Si eso es lo que necesitas, que así sea. - El filtrado basado en valores en esa matriz, aunque es posible, no va a ser tan bueno y Django ORM no lo hace tan obvio como lo hace para las tablas M2M.
Si utiliza M2M
- Puede filtrar más fácilmente esos valores relacionados
- Esos campos se posponen de forma predeterminada, puede usar
prefetch_related
si los necesita y luego se vuelve elegante si solo desea cargar un subconjunto de esos valores - El almacenamiento total en la base de datos será ligeramente mayor con M2M debido a las claves y los campos de identificación adicionales
- El costo de las uniones en este caso es completamente insignificante debido a las claves.
Personalmente diría que opte por las tablas M2M, pero no conozco su aplicación específica. Si va a trabajar con una gran cantidad de datos, probablemente valga la pena obtener un conjunto de datos representativo y probar ambos métodos con él.