Wenn Sie ein Array-Feld verwenden
- Die Größe jeder Zeile in Ihrer Datenbank wird etwas groß sein, daher wird Postgres viel mehr Toast-Tabellen verwenden (http://www.postgresql.org/docs/9.5/static/storage-toast.html )
- Jedes Mal, wenn Sie die Zeile erhalten, es sei denn, Sie verwenden ausdrücklich
defer
(https://docs.djangoproject.com/en/1.9 /ref/models/querysets/#defer ) das Feld oder schließen Sie es anderweitig überonly
von der Abfrage aus , odervalues
oder so, Sie zahlen die Kosten für das Laden all dieser Werte jedes Mal, wenn Sie über diese Zeile iterieren. Wenn es das ist, was du brauchst, dann sei es so. - Das Filtern basierend auf Werten in diesem Array ist zwar möglich, aber nicht so schön und das Django-ORM macht es nicht so offensichtlich wie bei M2M-Tabellen.
Wenn Sie M2M verwenden
- Sie können einfacher nach diesen verwandten Werten filtern
- Diese Felder werden standardmäßig zurückgestellt, Sie können
prefetch_related
verwenden wenn Sie sie brauchen und sich dann einfallen lassen, wenn Sie nur eine Teilmenge dieser Werte laden möchten - Der Gesamtspeicher in der DB wird bei M2M aufgrund von Schlüsseln und zusätzlichen ID-Feldern etwas höher sein
- Die Kosten für die Joins sind in diesem Fall wegen der Schlüssel völlig vernachlässigbar.
Persönlich würde ich sagen, gehen Sie mit den M2M-Tabellen, aber ich kenne Ihre spezifische Anwendung nicht. Wenn Sie mit einer großen Datenmenge arbeiten, lohnt es sich wahrscheinlich, sich einen repräsentativen Datensatz zu besorgen und beide Methoden damit zu testen.