17. februar 2006 - 13:41Der er
16 kommentarer og 1 løsning
Relation mellem klasser
Jeg har i min database 1:m relation mellem tabellerne hold og elever, hvor et hold kan have mange elever. Jeg har derfor oprettet to classes i koden, hvor der i hold er et array, som skal indeholde elever. Det virker fint, men hvordan får jeg smartest puttet dataene fra databasen ind?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Ok, men skal jeg så først lave en forespørgsel, som finder alle klasser og derefter en forespørgsel for hver klasse som finder eleverne til klassen, som kan puttes i addelev(elevobject) i klassen hold?
public class Hold { private List elever = new ArrayList(); ... public addElev(Elev e) { elever.add(e); } public int antalElever() { return elever.size(); } public Elev getElev(int no) { return (Elev)elever.get(no); } }
Nedenstående eksempel er i PHP og ikke java, men det er ikke relevant for mit spørgsmaal. (1)Er det en fornuftig OO struktur. (2)Hvordan vil oprettelsen af objekterne kunne laves hvis de kommer fra en database med tabellerne klasse og elev, hvor en klasse kan have flere elever og en elev kan kun være i en klasse.
Kode:
<?php /*****************************Klasser*******************************/ class elev { var $elevnavn;
function elev($elevnavn) { $this->elevnavn=$elevnavn; } function getElevnavn () { return $this->elevnavn; } }
class klasse {
var $klassenavn; var $elever; function klasse($klassenavn) { $this->klassenavn=$klassenavn; }
function addElev($elev) { $this->elever[]= $elev; }
function getKlassenavn () { return $this->klassenavn; } function getElever() { return $this->elever; } }
/*****************************Oprettelse af objekter************************/
i Java ville man nok foelge bean konvention (og have noget private public), men det er en detalje
laese fra database burde vaere lige ud af landevejen
du aabner klasse tabellen og laser alle klasser og opretter et objekt for hver (i Java vil du nok gemme dem i en HashMap - i PHP i et associativt array)
derefter aabner du elev tabellen og laeser en elev af gangen, opretter et objekt for hver og tilfoejer dem til den rigtige klasse
PS: Hvis associationen skal vaere bidirectional skal elev ogsaa have en reference til den klasse som han/hun tilhoerer - i objekt modellen - ikke i den relationelle database
Hvis jeg forstår dig rigtig skal jeg så lave to forespørgsler og lagre primærnøglerne i objekterne, så jeg senere kan oprette relationerne mellem objekterne. I psydokode:
Er det ikke ressourcekrævende at lave en forespørgsel mere til databasen for at tjekke hvilken klasse en elev tilhører. Så er man oppe på tre forespørgsler. Dog kun med en join.
det bliver da kun til 2 queries - "SELECT * FROM elev" returnerer vel klassen
du kan ogsaa godt lave en query med en JOIN (og teste for naar klassen aendres)
alt ovenfor antager at man skal loade alle data fra database til memory i praksis kan man forestille sig andre brugs moenstre
SELECT navn FROM klasse bruger vaelger klasse SELECT * FROM klasse WHERE navn = X opret klasse objekt SELECT * FROM elev WHERE klasse = Y opret elev objekter og add til klasse
var ogsaa en mulighed
et kendt begreb er "lazy loading" hvor man ved oprettelse af klasse objektet ikke henter eleverne, men foerst henter dem fra databasen naar de faktisk skal bruges
det kan give en markant bedre performance hvis man ikek altid skal bruge eleverne
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.