FAQ |
Kalender |
2011-02-11, 13:28 | #1 | ||
|
|||
Medlem
|
Hur brukar ni hantera table joins i samband med att en objektmodell används och man ska visa data.
Exempelvis om har en "User" klass (som mappar mot en User tabell) för att representera en användare. Typiskt är att man vill visa data som inte finns i User tabellen och istället hämta detta data via en join, t.ex vilket land en användare tillhör. Det går ju att lösa med denna princip <?php class UserRepository{ public getUsers() { $result = mysql_query("select users.*, country.name as CountryName from users left join user.countryId on country.id"); $objectArray = array(); while ($row = mysql_fetch_array($result)) { $user = new User(); $user->UserName = $row['username']; $user->CountryName = $row['CountryName']; $objectArray[] = $user; } return $objectArray; } } ?> Dock känns det inte helt klockrent. Det blir ju b.la beroenden till olika tabeller. Finns det någon best practice eller tutorial kring detta? Jag är medveten om ORM , men tänkte främst på en lösning utan att implementera den tekniken. |
||
Svara med citat |
2011-02-11, 21:03 | #2 | |||
|
||||
Mycket flitig postare
|
||||
Svara med citat |
2011-02-14, 21:48 | #3 | ||
|
|||
Har WN som tidsfördriv
|
Försöker du lagra objekt med många statiska egenskaper och lite relationer i ett RDBMS kanske du istället ska titta på NoSQL-databaser som MongoDB.
|
||
Svara med citat |
2011-02-15, 09:51 | #4 | ||
|
|||
Medlem
|
Citat:
En grej är att man vill att klassen ska mappa exakt mot tabellen men om man lägger till egenskaper i klassen som inte finns i tabellen så bryter man den principen. Jag funderar nu istället på att börja köra utan joins så mycket det går och köra lazy loading för att ladda relaterade objekt,dvs mer likt ett ORM. Vad tror ni om prestanda/skalbarhet vad gäller ett (nästan) "join fritt" system? Det skulle bli väsentligt fler queries, vilket kan väl tänkas sänka prestanda generellt. Dock så kan jag tänka mig att det skalar bättre i vissa fall när det blir så mycket data att joins börjar bli sega(?) Citat:
|
||
Svara med citat |
2011-02-15, 11:31 | #5 | ||
|
|||
Klarade millennium-buggen
|
Du kan ju mappa till tabellerna med dina modeller och om du har behov av en join så gör du en ny mappning där du extendar den mappningen du redan har.
Då stämmer mappningen med tabeller och med joins. |
||
Svara med citat |
2011-02-15, 21:58 | #6 | |||
|
||||
Mycket flitig postare
|
Citat:
Citat:
Har du tittat på någon form av cache? Att bara cacha dom tyngsta frågorna kan avlasta databasen en hel del. Senast redigerad av dAEk den 2011-02-15 klockan 22:07 Anledning: Ursäkta om det blev lite osammanhängande. |
|||
Svara med citat |
2011-02-17, 14:20 | #7 | ||
|
|||
Medlem
|
Citat:
Citat:
Jag tror t.o.m en del ORM kör lazy load per default och då enligt principen en sql fråga per objekt, så det är väl kanske inte så extremt nuförtiden. |
||
Svara med citat |
2011-02-17, 15:11 | #8 | ||
|
|||
Har WN som tidsfördriv
|
Om du vill ha en flexibel datamodell och "snabbt få upp ett relativt enkelt sytem", kolla på MongoDB! Du verkar ju ändå vara inne på denormalisering. MongoDB är helt schemaless och syntax är 100% JavaScript.
Introduktion: http://www.youtube.com/watch?v=w5qr4sx5Vt0 Gratis hostning av MongoDB-databas (troligen begränsad prestanda): https://mongolab.com/about/pricing/ Testa shellkonsolen: http://try.mongodb.org/ Senast redigerad av Adestro den 2011-02-17 klockan 15:20 |
||
Svara med citat |
2011-02-21, 22:43 | #9 | |||
|
||||
Mycket flitig postare
|
Citat:
Citat:
|
|||
Svara med citat |
2011-02-22, 15:16 | #10 | ||
|
|||
Medlem
|
Citat:
Annars är problemet att jag inte hittat ett ORM som är enkelt och flexibelt än. Doctrine m.fl är för komplexa i mina syften.. Nåväl för den ursprungliga frågan jag tror jag frångår en princip att låta klasser mappa exakt mot databastabeller, och modellerar entiteter i stället (se nedan för bloggposter knutna till en användare). Sedan får ett repository lager innehålla joins helt fritt.. <?php class User { private $id; private $name; private $blogPosts; public function __construct($id, $name) { $this->id = $id; $this->name = $name; } public function addPost(BlogPost $p) { $this->blogPosts[] = $p; } public function getPost($i) { return $this->blogPosts[$i]; } } ?> |
||
Svara med citat |
Svara |
|
|