PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django Postgres ArrayField vs. One-to-Many-Beziehung

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 über only von der Abfrage aus , oder values 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.