Wegen dieses Problems sind wir vom ORM in Django abgekommen. Im Grunde genommen, wenn Sie versuchen und tun
for p in person:
print p.car.colour
Der ORM gibt gerne alle Personen zurück (typischerweise als Instanzen eines Person-Objekts), aber dann muss er die Autotabelle für jede Person abfragen.
Ein einfacher und sehr effektiver Ansatz hierfür ist das, was ich als " Leporello-Faltung "Damit wird die unsinnige Vorstellung vermieden, dass Abfrageergebnisse aus einer relationalen Datenbank auf die Originaltabellen zurückgeführt werden sollten, aus denen die Abfrage zusammengestellt wurde.
Schritt 1: Breite Auswahl
select * from people_car_colour; # this is a view or sql function
Dies ergibt etwas wie
p.id | p.name | p.telno | car.id | car.type | car.colour
-----+--------+---------+--------+----------+-----------
2 | jones | 2145 | 77 | ford | red
2 | jones | 2145 | 1012 | toyota | blue
16 | ashby | 124 | 99 | bmw | yellow
Schritt 2: Objektivieren
Saugen Sie die Ergebnisse in ein generisches Objekt Creator mit einem Argument zu teilen nach dem dritten Element. Das bedeutet, dass das Objekt "jones" nicht mehr als einmal erstellt wird.
Schritt 3: Rendern
for p in people:
print p.car.colour # no more car queries
Siehe diese Webseite für eine Implementierung von Leporello-Faltung für Python.
2 Stimmen
Es gibt einige hilfreiche Beiträge, die sich mit diesem Problem und der möglichen Lösung befassen. Häufige Anwendungsprobleme und deren Behebung: Das Select N + 1 Problem , Die (silberne) Kugel für das N+1 Problem , Langsames Laden - eifriges Laden
0 Stimmen
Für alle, die nach einer Lösung für dieses Problem suchen, habe ich einen Beitrag gefunden, der es beschreibt. stackoverflow.com/questions/32453989/
54 Stimmen
Wenn man die Antworten bedenkt, sollte man dies nicht als 1+N Problem bezeichnen? Da es sich um eine Terminologie zu handeln scheint, frage ich nicht speziell OP.