sql >> Databasteknik >  >> RDS >> PostgreSQL

Django Postgres ArrayField vs One-to-Many relation

Om du använder ett matrisfält

  • Storleken på varje rad i din DB kommer att bli lite stor, så Postgres kommer att använda mycket fler toastbord (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
  • Varje gång du får raden, om du inte specifikt använder defer (https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) fältet eller på annat sätt exkludera det från frågan via only , eller values eller något, du betalar kostnaden för att ladda alla dessa värden varje gång du itererar över den raden. Om det är vad du behöver så är det så.
  • Filtrering baserat på värden i den arrayen, även om det är möjligt kommer inte att vara lika trevligt och Django ORM gör det inte lika självklart som det gör för M2M-tabeller.

Om du använder M2M

  • Du kan enklare filtrera på dessa relaterade värden
  • Dessa fält skjuts upp som standard, du kan använda prefetch_related om du behöver dem och sedan bli fancy om du bara vill ha en delmängd av dessa värden laddade
  • Total lagring i DB kommer att bli något högre med M2M på grund av nycklar och extra id-fält
  • Kostnaden för kopplingarna i det här fallet är helt försumbar på grund av nycklar.

Personligen skulle jag säga gå med M2M-tabellerna, men jag vet inte din specifika tillämpning. Om du ska arbeta med en enorm mängd data är det sannolikt värt att ta tag i en representativ datauppsättning och testa båda metoderna med den.




  1. oracle hämta alla matchade förekomster från en kolumn

  2. MySQL 5.5 partitionstabell av A-Z

  3. Hur laddar man ett stort antal strängar för att matcha med Oracle-databasen?

  4. Finns det en prestandaskillnad mellan CTE , Sub-Query, Temporary tabell eller Tabellvariabel?