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
, nebovalues
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.