sql >> Databáze >  >> RDS >> PostgreSQL

Vztah Django Postgres ArrayField vs. One-to-Many

Pokud použijete pole pole

  • Velikost každého řádku ve vaší DB bude trochu velká, takže Postgres bude používat mnohem více toastových tabulek (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
  • Pokaždé, když získáte řádek, pokud konkrétně nepoužijete defer (https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) pole nebo jej jinak vyloučit z dotazu pomocí only , nebo values nebo tak něco, platíte náklady na načtení všech těchto hodnot pokaždé, když iterujete přes tento řádek. Pokud je to to, co potřebujete, tak ano.
  • Filtrování na základě hodnot v tomto poli, i když je to možné, nebude tak příjemné a Django ORM to neučiní tak zřejmé jako u tabulek M2M.

Pokud používáte M2M

  • Tyto související hodnoty můžete snadněji filtrovat
  • Tato pole jsou ve výchozím nastavení odložena, můžete použít prefetch_related pokud je potřebujete, a pak si vychutnejte, pokud chcete načíst pouze podmnožinu těchto hodnot
  • Celkové úložiště v DB bude s M2M o něco vyšší kvůli klíčům a dalším polím ID
  • Náklady na spojení jsou v tomto případě kvůli klíčům zcela zanedbatelné.

Osobně bych řekl, že jít s tabulkami M2M, ale neznám vaši konkrétní aplikaci. Pokud budete pracovat s obrovským množstvím dat, pravděpodobně se vyplatí vzít reprezentativní datovou sadu a otestovat s ní obě metody.




  1. MySQL GROUP BY a vyplnit prázdné řádky

  2. Přehled komprese dat v SQL Server

  3. mysql regex inverse (pouze pro použití REGEXP)

  4. Jak funguje Ceiling() v PostgreSQL