Ich habe im Grunde das klassische Modell von vielen zu vielen. Ein Benutzer, eine Auszeichnung und eine "Many-to-many"-Tabelle, die Benutzer und Auszeichnungen einander zuordnet.
Jeder Nutzer hat etwa 400 Auszeichnungen und jede Auszeichnung wird an etwa die Hälfte der Nutzer vergeben.
Ich möchte alle Auszeichnungen des Benutzers durchgehen und ihre Punkte zusammenzählen. In SQL wäre es eine Tabellenverknüpfung zwischen den Many-to-Many und dann durch jede der Zeilen gehen. Auf einem anständigen Rechner mit einer MySQL-Instanz sollten 400 Zeilen keine große Sache sein.
In der App-Engine brauche ich etwa 10 Sekunden für die Summe. Die meiste Zeit wird im Datenspeicher von Google verbracht. Hier sind die ersten paar Zeilen von cProfile
ncalls tottime percall cumtime percall filename:lineno(function)
462 6.291 0.014 6.868 0.015 {google3.apphosting.runtime.\_apphosting\_runtime\_\_\_python\_\_apiproxy.Wait}
913 0.148 0.000 1.437 0.002 datastore.py:524(\_FromPb)
8212 0.130 0.000 0.502 0.000 datastore\_types.py:1345(FromPropertyPb)
462 0.120 0.000 0.458 0.001 {google3.net.proto.\_net\_proto\_\_\_parse\_\_python.MergeFromString}
Ist mein Datenmodell falsch? Mache ich die Lookups falsch? Ist dies ein Manko, das ich mit Caching und Bulkupdating beheben muss (was sehr mühsam wäre).