Jeśli używasz pola tablicowego
- Rozmiar każdego wiersza w Twojej bazie danych będzie nieco duży, dlatego Postgres będzie używał znacznie więcej tabel tostów (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- Za każdym razem, gdy otrzymasz wiersz, chyba że specjalnie użyjesz
defer
(https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) pole lub w inny sposób wykluczyć je z zapytania za pomocąonly
lubvalues
czy coś, płacisz koszt ładowania wszystkich tych wartości za każdym razem, gdy iterujesz w tym wierszu. Jeśli tego potrzebujesz, niech tak będzie. - Filtrowanie na podstawie wartości w tej tablicy, chociaż możliwe, nie będzie tak przyjemne, a Django ORM nie czyni tego tak oczywistym, jak w przypadku tabel M2M.
Jeśli używasz M2M
- Możesz łatwiej filtrować te powiązane wartości
- Te pola są domyślnie odroczone, możesz użyć
prefetch_related
jeśli ich potrzebujesz, a następnie wyobraź sobie, jeśli chcesz, aby załadowany był tylko podzbiór tych wartości - Całkowita pamięć w DB będzie nieco wyższa w przypadku M2M z powodu kluczy i dodatkowych pól identyfikatorów
- Koszt złączeń w tym przypadku jest całkowicie pomijalny ze względu na klucze.
Osobiście powiedziałbym, że idź ze stołami M2M, ale nie znam twojej konkretnej aplikacji. Jeśli masz zamiar pracować z ogromną ilością danych, prawdopodobnie warto pobrać reprezentatywny zestaw danych i przetestować z nim obie metody.