Na ja, ich hatte dazu ja mal eine Idee beigesteuert. Auf den Edit-Seiten macht das Konstrukt IMHO relativ wenige Probleme (da nur für einen User/Datensatz die Plugins durchgegangen werden müssen).
Probleme sehe ich bei:
1. Auflistungen/Übersichten
2. Sortierung
3. Suche
Mein Vorschlag war, in der class.genericdb.php eine Methode getPropertyAll zu definieren, die pro Element alle Properties einliest und in ein Property-Array (des Objekts) überträgt [sowas wie $aProperty[$type][$name] = $value]). Das ist einfach, da die Properties durch Name der Item-Klasse und ID relativ eindeutig definiert sind.
Nun würde ich getProperty ändern (sinngemäß):
"Wenn Type+Name Element in aProperty, dann return $aProperty[$type][$name], sonst hole Daten aus DB"
Hierbei ergibt sich natürlich das Problem, dass es noch in die DB geht, wenn ein Wert bisher noch nie geschrieben wurde. Da gäbe es entweder die Möglichkeit, eine spezielle getPropertyFromArray Methode zu ergänzen oder in getPropertyAll ein Flag zu setzen, welches in getProperty abgefragt wird (vermutlich die eleganteste Methode). D.h. wenn "bArrayAvailable", dann liefere nur die Information aus dem Array.
Das löst 1. und ergibt eine Abfrage pro Element, halte ich für vertretbar.
2. und 3. können auf diese Weise verbessert werden.
Das schöne an der Lösung ist, dass weder an den Plugins noch in den Dialogfenstern zunächst etwas geändert werden muss - jedoch z.B. das FrontendUser-Menü recht einfach signifikant beschleunigt werden könnte.
Leider ist auch dieser Ansatz IMHO nicht geeignet, 2. und 3. zu lösen (deswegen auch nur "verbessern"), da nach wie vor alle Daten zunächst eingelesen, im Speicher gesucht und die Ergebnisse sortiert werden müssen. Bei 2000 Usern und 20 Plugins mit 20 Feldern reduziert sich aber immerhin die Abfragezahl von 1 + (2000 x 20) = 40001 auf 1 + 2000 = 2001.
Eine echte, hochperformante Lösung für das Problem (wenn auch in Plugin-Informationen gesucht und nach ihnen sortiert werden soll) gibt es IMHO nur, wenn man
a) die Speicherung von Plugin-Informationen auf die Properties-DB der gleichen Datenbank einschränkt und
b) die Plugins geeignet erweitert, so dass eine SQL-Abfrage konstruiert werden kann, die das gewünschte Ergebnis liefert
Es könnte evtl. auch Sinn machen, wie von Dir vorgeschlagen, in den Plugins eine Methode zu ergänzen, die Typ und Name der verwendeten Properties als Array zurückliefert. Allerdings nützt das nur etwas, wenn die späteren Daten aus den Properties geliefert werden (Argument von timo: Die Daten der Plugins könnten auch aus einer Text-Datei oder einem Webservice geliefert werden).
Bei der aktuellen Überarbeitung des Newsletter-Bereichs (gleiches Problem) habe ich es zunächst so gelöst, dass ich wieder zurück zu den Basic gegangen bin: Es wird ein SQL-Statement mit LIMIT erzeugt, Plugins werden (noch) nicht berücksichtigt (in der Auflistung).
Ist wahnwitzig schnell...
Gruß
HerrB