Der Guide mal wieder

Huhu,

ich hoffe ich nerve hier niemandem mit meinem gefrage …

also zur sache:

[b]

Seit Version 1.0.2 können sie auch erzwingen, dass die relationale Abfrage mit genau einer SQL Abfrage durchgeführt wird. Fügen Sie einfach einen together()-Aufruf nach with() an, z.B.

$posts=Post::model()->with(

'author.profile',


'author.posts',


'categories')->together()->findAll();

Die obige Abfrage wird über eine einzelne SQL-Abfrage ausgeführt. Ohne den Aufruf von together würden zwei SQL Abfragen benötigt werden: eine, für den Verbund der Tabellen Post, User und Profile und eine, die die Tabellen User und Post verbindet.

[/b]

kann mir wer erklären warum die together methode nur eine einzige Abfrage braucht?

Hat es irgendwelche nachteile?

Danke sehr :)

Lg

Ins blaue geraten:

Mit dem "together" wird ein JOIN über mehrere Tabellen gesetzt. Das heisst, das ein Kreuzprodukt aus der Anzahl der einzelnen Ergebnisse erstellt wird. Etwas weniger mathematisch: Die Beziehungen werden in der Datanbank geladen. Dies führt zu deutlich mehr Ergebniszeilen, als die einzelabfragen. Ist schneller, aber braucht mehr Speicher in der Datenbank. Soll heissen, bei sehr großen Tabellen finger davon lassen.

Aber wie gesagt. Das ist ins blaue geraten.

Christian

Alles in einem Select abzufrühstücken ist schneller als wenn man Ping Pong zwischen PHP und Datenbank spielt.

EIn join sähe zb so aus




SELECT * FROM author a LEFT JOIN profile p ON a.id = p.author_id




Das mit den sehr großen Tabellen und "Finger davon lassen" stimmt nicht. Gerade bei großen Tabellen ist es sinnvoller das über mysql zu machen als alles an php zu schieben. Das Einzige worauf man bei Joins achten sollte, ist das man über indizierte Spalten die joins macht. Andersfalls kann es sehr sehr langsam werden. Bei yii ist das aber keine Problem, da er nur joins über FKs oder PKs macht, die immer mit einem Index versehen sind.

Beim einem select liesst die Datenbank nicht alle Inhalte, sondern schaut sich nur die Dinge in der "WHERE" Clause an. Beim "fetchen", also beim Ausgeben der Resultate werden natürlich alle geforderten Spalten ausgeben und wenn diese z.b BLOBs enthalten kann es auch mal länger dauern. Aber darum kommt so oder so nicht drum rum, ob man joins benutzt oder nicht.

Oki Danke für die Erklärung :)