sql >> Base de Datos >  >> RDS >> PostgreSQL

Django Postgres ArrayField vs relación uno a muchos

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 de only , o values 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.