MongoDB - hogyan kell/érdemes 'join'-olni
Sziasztok,
Ezzel kapcsolatban kezdtem elásni magam a Mongoba.
http://weblabor.hu/forumok/temak/118636
Azt nem értem még, hogyan lehet megvalósítani a dokumentumok összekapcsolását egy find-on belül.
Tegyük fel, hogy vannak a tulajdonságok. 1-1 tulajdonság a property collection-ben 1-1 doc.
Van az item collection, amiben vannak a tételek és minden tételnek van egy 'properties' tulajdonsága. Ebbe van felsorolva a property collection néháy dokumentumának az id-ja.
Hogy érem el, hogy ha lekérdezek egy item-et, akkor a properties-ben ne a property-id-kat lássam hanem magát a property-t.
Ha lekérek mondjuk ezer item-et és a bejáró ciklusba egyessével lekérdezgetem a property-ket az itemhez tartozó property_id-val akkor az elég sok find lesz. Feltételezem nem ez a legoptimálisabb.
■ Ezzel kapcsolatban kezdtem elásni magam a Mongoba.
http://weblabor.hu/forumok/temak/118636
Azt nem értem még, hogyan lehet megvalósítani a dokumentumok összekapcsolását egy find-on belül.
Tegyük fel, hogy vannak a tulajdonságok. 1-1 tulajdonság a property collection-ben 1-1 doc.
Van az item collection, amiben vannak a tételek és minden tételnek van egy 'properties' tulajdonsága. Ebbe van felsorolva a property collection néháy dokumentumának az id-ja.
Hogy érem el, hogy ha lekérdezek egy item-et, akkor a properties-ben ne a property-id-kat lássam hanem magát a property-t.
Ha lekérek mondjuk ezer item-et és a bejáró ciklusba egyessével lekérdezgetem a property-ket az itemhez tartozó property_id-val akkor az elég sok find lesz. Feltételezem nem ez a legoptimálisabb.
link
Modeling Data Relationships in MongoDB
Nézegetem nézegetem, de nem
Sajnos az angolom nem olyan erős, hogy végigolvassam :)
Nem kell/érdemes joinolni
Elég nehéz így gondolkozni
És hogy oldod meg ha a 'foo'-t 'foo2'-re szeretnéd átnevezni minden itemnél?
Egyszerűen végig kell futtatni az összes item doksin az átnevezést? És ha az egyik valami oknál fogva hibásan neveződik át, akkor már sosem lehet azonosítani többé!?
És az gáz ha elteszem mellé
"name": "quux",
"properties": [
{
"id" : 123
"name" : "foo"
},
{
"id" : 124
"name" : "bar"
}
]
}
így már nem a neve alapján kell keresnem hanem id alapján is tudom. Így eltudom képzelni, hogy használható legyen.
Szerintetek?
Miért kell neki azonosító?
Egyszerűen végig kell futtatni az összes item doksin az átnevezést? És ha az egyik valami oknál fogva hibásan neveződik át, akkor már sosem lehet azonosítani többé!?
Másik lehetőség a 2PC.
Azért tennék be azonosítót,
Ez az isolate jófélének tűnik, bár úgy képzelem el mint egy kötegelt update-t. Vagy nem jól látom? Ha igen, akkor meg a lockolás "sokáig" is tarthat. Nem?
Úgy hogy beágyazod a
De amúgy (nagy mennyiségű adat esetén) rendelkezésedre áll a MongoDB Ref.
Itt lehetőséged van össze kapcsolni különböző adatokat "idegen kulcs" alapján. A probléma ezzel annyi, hogy a MongoDB-hez használt driver-nek ezt támogatnia kell.
Ha ez nincs akkor marad az, hogy te magad össze párosítod az adatokat, kézzel több lekérdezésen keresztül. Pl.: Így teszt a MongooseJS (NodeJS) populate funkciója is.
MongodDB Ref-et néztem és
Ez sem igazi join, a DBRef
Nem tudom mennyire van
Pl.: PHP-hez a mandango-t vagy a Doctrine próbáld ki.
Bár az előbbinek jobb a teljesítmény tesztje.
A dokumentációból:
mandango - Relation Mapping
mandango - Reference Mapping
szerk.:
Egyet kihagytam. A Morph-ot.
Morph - Relationships
Doctrine-t használok és
Doctrine-t használok és
Persze értem én. Én is úgy gondoltam. :)
A lényeg, hogy két irányba mehetsz.
1. Növeled a redundanciát, ezzel növekszenek a módosítási anomáliák, de csökken a lekérdezéseid száma.
Pl.: van két kollekciód. felhasználók és a bejegyzések. Ha a bejegyzéseknél sűrűn kell megmutatni azon felhasználó nevét aki létrehozta, akkor megteheted hogy az ID mellé elrakod a nevét is. Így a megjelenítéskor megspórolhatsz egy lekérdezést. Viszont ha a név módosul akkor nem csak a felhasználók kollekciót kell frissíteni, hanem a bejegyzésekét is.
2. Az hogy az relációs sémához hasonlóan idegen kulcsot tárolsz. Amit akkor érdemes ha nagyon eltérnek az adatok, mint a felhasználó és a bejegyzés. Ilyenkor mindig kell még egy lekérdezés. Ilyenek mint a hozzászólások a bejegyzéshez ezek elférnek még a bejegyzések dokumentumban.
Ilyen esetekben a megoldást a feladat választja, mint mindig. Annyival jobb, hogy van miből választani. Itt vannak a lehetőségek: MongoDB data-modeling.
Egy megjegyzés a mongodb-ről. Mivel dokumentum orientált, így az SQL-hez hasonló aggregációs feladatok elvégzése is nagyon nehézkes. Van rá egy nagyon jó keretrendszer a mongo-n belül. De itt különösen érvényes az a szabály, hogy amit csak lehet azt érdemes elő aggregálni.