Ik heb een MySQL database die vanwege het toepassingsdomein sterk genormaliseerd moet zijn. Het is de bedoeling dat ik binnen een Symfony applicatie (PHP) zoekresultaten uit deze database kan weergeven. Dit werkt ondertussen prima door eenvoudigweg de zoekcriteria op te bouwen met een Doctrine querybuilder (ORM).
Als resultaat krijg ik een array van objecten die aan de criteria voldoen. Het probleem is dat ik in sommige gevallen alle objecten uit de lijst volledig wil visualiseren. Omdat mijn database sterk genormaliseerd is, bevat elk object genest tot 20 relaties, wat voor een gigantische hoop N+1 queries zorgt. Bij 100 resultaten zit ik al snel aan 2000 queries, wat echt niet kan.
Fetch joins zijn mogelijks een oplossing voor dit probleem, maar in mijn geval wordt het aantal joins te groot waardoor de result set oneindig groot wordt (en het hydraten van de objecten oneindig lang duurt /geheugen nodig heeft). Er is echter een andere oplossing die ik momenteel gebruik: https://ocramius.github.i...m-optimization-hydration/. Met deze laatste oplossing kan ik de 20 geneste relaties van de gehele result set in één keer ophalen, waardoor ik dus maar 21 queries in totaal heb.
Allemaal goed en wel, maar ik heb het gevoel dat ik technologie aan het gebruiken ben die niet voor dit doel geschikt is. Ook is deze manier van werken niet echt flexibel. Een document store zoals MongoDB lijkt mij hier een betere oplossing voor. Ik zou dus eerst mijn gehele database kunnen serializen en in MongoDB steken, om deze vervolgens bij het zoeken te raadplegen.
Hierbij wil ik benadrukken dat het zoeken naar de resultaten zelf geen probleem is; er zitten geen text searches tussen dus dit is een ideale toepassing voor SQL (moest iemand denken aan bvb Elasticsearch). Het idee is om met een lijst van verkregen IDs na de zoekopdracht de resultaten op te halen uit MongoDB.
Ik zou eigenlijk gewoon wat feedback willen of dit een goed idee is en hoe anderen met dit probleem omgaan.
En nee, geen ORM gebruiken is geen oplossing, de queries zouden hoe dan ook zonder ORM ook apart uitgevoerd moeten worden
Als resultaat krijg ik een array van objecten die aan de criteria voldoen. Het probleem is dat ik in sommige gevallen alle objecten uit de lijst volledig wil visualiseren. Omdat mijn database sterk genormaliseerd is, bevat elk object genest tot 20 relaties, wat voor een gigantische hoop N+1 queries zorgt. Bij 100 resultaten zit ik al snel aan 2000 queries, wat echt niet kan.
Fetch joins zijn mogelijks een oplossing voor dit probleem, maar in mijn geval wordt het aantal joins te groot waardoor de result set oneindig groot wordt (en het hydraten van de objecten oneindig lang duurt /geheugen nodig heeft). Er is echter een andere oplossing die ik momenteel gebruik: https://ocramius.github.i...m-optimization-hydration/. Met deze laatste oplossing kan ik de 20 geneste relaties van de gehele result set in één keer ophalen, waardoor ik dus maar 21 queries in totaal heb.
Allemaal goed en wel, maar ik heb het gevoel dat ik technologie aan het gebruiken ben die niet voor dit doel geschikt is. Ook is deze manier van werken niet echt flexibel. Een document store zoals MongoDB lijkt mij hier een betere oplossing voor. Ik zou dus eerst mijn gehele database kunnen serializen en in MongoDB steken, om deze vervolgens bij het zoeken te raadplegen.
Hierbij wil ik benadrukken dat het zoeken naar de resultaten zelf geen probleem is; er zitten geen text searches tussen dus dit is een ideale toepassing voor SQL (moest iemand denken aan bvb Elasticsearch). Het idee is om met een lijst van verkregen IDs na de zoekopdracht de resultaten op te halen uit MongoDB.
Ik zou eigenlijk gewoon wat feedback willen of dit een goed idee is en hoe anderen met dit probleem omgaan.
En nee, geen ORM gebruiken is geen oplossing, de queries zouden hoe dan ook zonder ORM ook apart uitgevoerd moeten worden
[ Voor 4% gewijzigd door egonolieux op 07-04-2018 05:00 ]