PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Django Postgres ArrayField vs relacionamento um-para-muitos


Se você usar um campo de matriz
  • O tamanho de cada linha em seu banco de dados será um pouco grande, portanto, o Postgres usará muito mais tabelas de brinde (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
  • Toda vez que você obtém a linha, a menos que use especificamente defer (https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) o campo ou excluí-lo da consulta via only , ou values ou algo assim, você paga o custo de carregar todos esses valores toda vez que iterar nessa linha. Se é isso que você precisa, que assim seja.
  • Filtrar com base em valores nesse array, embora possível, não será tão bom e o Django ORM não o torna tão óbvio quanto para tabelas M2M.

Se você usa M2M
  • Você pode filtrar mais facilmente esses valores relacionados
  • Esses campos são adiados por padrão, você pode usar prefetch_related se você precisar deles e depois ficar chique se quiser apenas um subconjunto desses valores carregados
  • O armazenamento total no banco de dados será um pouco maior com M2M por causa de chaves e campos de id extras
  • O custo das junções neste caso é completamente insignificante por causa das chaves.

Pessoalmente, eu diria que vá com as tabelas M2M, mas não conheço sua aplicação específica. Se você estiver trabalhando com uma grande quantidade de dados, provavelmente vale a pena pegar um conjunto de dados representativo e testar os dois métodos com ele.