PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Django Postgres ArrayField vs relazione uno-a-molti

Se utilizzi un campo array

  • La dimensione di ogni riga nel tuo DB sarà un po' grande, quindi Postgres utilizzerà molte più tabelle di toast (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
  • Ogni volta che ottieni la riga, a meno che non utilizzi specificamente defer (https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) il campo o escluderlo in altro modo dalla query tramite only o values o qualcosa del genere, stai pagando il costo del caricamento di tutti quei valori ogni volta che esegui un'iterazione su quella riga. Se è quello che ti serve, allora così sia.
  • Filtrare in base ai valori in quell'array, anche se possibile, non sarà così piacevole e Django ORM non lo rende così ovvio come per le tabelle M2M.

Se usi M2M

  • Puoi filtrare più facilmente quei valori correlati
  • Quei campi vengono posticipati per impostazione predefinita, puoi utilizzare prefetch_related se ne hai bisogno e poi divertiti se vuoi caricare solo un sottoinsieme di quei valori
  • Lo spazio di archiviazione totale nel database sarà leggermente superiore con M2M a causa delle chiavi e dei campi ID aggiuntivi
  • Il costo dei join in questo caso è del tutto irrisorio a causa delle chiavi.

Personalmente direi di andare con le tabelle M2M, ma non conosco la tua applicazione specifica. Se lavorerai con un'enorme quantità di dati, probabilmente vale la pena prendere un set di dati rappresentativo e testare entrambi i metodi con esso.