SORM gibt unter Umständen Einträge mehrfach zurück bzw. zählt diese doppelt (Beispiel: Course::findByUser())
Hat man eine Bedingung für die findBy
- oder countBy
-Methoden, die mindestens einen JOIN enthält, der dazu führt, dass Einträge mehrfach berücksichtigt werden, so gibt SORM das genauso zurück. Das führt dazu, dass Einträge mehrfach gezählt werden bzw. mehrfach zurückgegeben werden. Ein Beispiel im Kern ist Course::findByUser()
, welches eine Veranstaltung mehrfach zurückgibt, wenn diese über mehrere Semester geht.
Die Frage ist, wie SORM sich verhalten sollte.
- Beim Zählen ist es unerwartet, dass man eine zu hohe Zahl erhält
- Insbesondere bei den
findEach
-Methoden möchte man vermutlich auch nicht, dass man einen Eintrag mehrfach behandelt - Eine
SimpleORMapCollection
würde eine Rückgabe mit doppelten Einträgen gar nicht aufnehmen können, da ein doppelter Eintrag zu einerInvalidArgumentException
führen würde
Da SORM dieses Verhalten aber schon lange hat, sind die Implikationen noch nicht klar, wenn wir dies ändern würden. Eine mögliche Lösung, die zu testen ist, wäre, sowohl bei den Methoden ein DISTINCT
zu ergänzen. Hier muss aber sichergestellt werden, dass entweder das DISTINCT
nur ergänzt wird, wenn es überhaupt einen JOIN gibt oder dass der Query-Optimizer dieses zuverlässig wegoptimiert, wenn es nicht nötig sein sollte.
Nach einiger Diskussion und der bereits implementierten Variante eines generellen DISTINCT
bei Joins sollen nun doch explizite Methoden implementiert werden, um punktuell das gewünschte Verhalten erreichen zu können. Ein generelles DISTINCT
über alle Spalten einer Tabelle könnte zu große Auswirkungen auf die Performance haben.