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

Kann ein PostgreSQL-Array für Joins optimiert werden?

Nein, das Speichern von FKs in einem Array ist niemals eine gute Idee für Allzwecktabellen. Da wäre zunächst die von Ihnen am Rande erwähnte Tatsache:Foreign Key Constraints für Array-Elemente sind (noch) nicht implementiert. Dies allein sollte die Idee entkräften.

Es gab einen Versuch, das Feature für Postgres 9.3 zu implementieren, der durch schwerwiegende Leistungsprobleme gestoppt wurde. Siehe diesen Thread zu pgsql-hackers.

Während die Leseleistung mit Arrays für bestimmte Anwendungsfälle verbessert werden kann, sinkt die Schreibleistung. Stellen Sie sich vor:Um ein einzelnes Element aus einem langen Array einzufügen, zu aktualisieren oder zu löschen, müssen Sie jetzt für jedes geänderte Element eine neue Zeilenversion mit dem gesamten Array schreiben. Und ich sehe auch ernsthafte Sperrkonflikte vor uns.

Wenn Ihre Tabelle schreibgeschützt ist , beginnt die Idee mehr Sinn zu machen. Aber dann würde ich eine materialisierte Ansicht in Betracht ziehen mit denormalisierten Arrays oben einer normalisierten Many-to-Many-Implementierung:

Dabei kann das MV alle Join-Tabellen einbeziehen und eine flache Tabelle für eine noch bessere Leseleistung (für typische Anwendungsfälle) erstellen. Auf diese Weise erhalten Sie referentielle Integrität und gute Lese- (und Schreib-) Leistung - auf Kosten des Overheads und zusätzlichen Speichers für die Verwaltung des MV.