ORM of niet?
Nu is mijn vraag: Is het handig om voor dit project een ORM te gebruiken of zal dit de server heel erg gaan vertragen? Hoewel de database niet zo heel groot is zal het aantal transacties op de database erg kunnen toenemen.
Ik heb nog nooit met een ORM gewerkt maar als het een handig dingetje is dan wil ik het wel graag leren. Wat zijn jullie meningen hierover?
(hoop ook dat het in het goede board staat, kon niet echt goed kiezen tussen OOP of DB)
Als je CI gaat gebruiken dan lijkt me dat de ActiveRecord implementatie van CI je snel op weg gaat helpen.
Het lijkt me dat de server er niet trager van wordt. De query moet immers een keer uitgevoerd worden. Doordat je nu het concentreert op 1 punt (in het model) en je structuur in je app krijgt zou het wel eens sneller kunnen zijn.
De learning curve bij CI is niet erg groot. Misschien vooraf een klein projectje maken, met 1 controller, 1 model en 1 view om het in de vingers te krijgen.
Het project wat ik wil ontwikkelen zal door veel personen met grote frequentie worden gebruikt aangezien het meer een combinatie is van veel andere projecten. Zou een ORM (als Doctrine of Propel) hier beter voor zijn of kan ik het beter op de Active Record klasse houden?
Ik zou de volgende afweging maken: als de relatie van je model tot de onderliggende database erg verschillend is, of als je model veel rekenwerk moet doen, dat niet querymatig opgelost kan worden dan zou ik een ORM overwegen op basis van een datamapper.
Als je model echter sterk gekoppeld is aan de onderliggende database, b.v. doordat je model properties 1 op 1 overeenkomen met de velden uit de onderliggende tabel, dan zou ik bij activerecord blijven.
En er zit natuurlijk ook een persoonlijke voorkeur aan. Bij een nieuw project ben ik een fan van Domain Driven Design, en ik probeer de modellen dan zo 'natuurlijk' mogelijk te maken. En echte wereld modellen komen zelden overeen met rij/kolom modellen in een database. Vandaar dat ik dan vaak voor een datamapper ga. Bij bestaande projecten die opgewaardeerd worden is het vaak ondoenlijk om de modellen aan te passen, dus daar blijf ik dan meestal bij active record.
In essentie maakt een ORM communicatie wel trager tov. het gebruiken van DBAL. Echter door het gebruiken van een goed ORM gaf mij dit meer controle op hoe data-caching geregeld is binnen mijn applicatie en het resultaat was dat de applicatie uiteindelijk betere performance bood tov de oude versie waar ik enkel DBAL gebruikte.
Voor de duidelijkheid, DBAL is Database Abstraction Layer, inprincipe is PDO al een DBAL.
Succes met je keuze!
Het is nog steeds een behoorlijke overweging die ik zal moeten maken. Misschien dat jullie me aan de hand van een voorbeeld een mening kunnen geven?
Stel dat ik een website als Facebook opnieuw zou maken in CI. Zouden jullie daar dan een ORM voor gebruiken als jij de enige ontwikkelaar bent? (Facebook is een behoorlijk complex iets maar het komt in de buurt wat betreft mijn project: Redelijke database + veel queries tegelijkertijd)
Voordelen:
- Je hoeft je geen zorgen meer te maken over hoe data opgeslagen is in de database en kan je focussen op het domein model
- Je kan eenvoudig switchen van database
- Relaties kunnen automatisch gevolgd worden, waardoor je minder SQL hoeft te schrijven
- Als je een goede ORM hebt handelt hij ook migratie voor je af
Nadelen:
- Je hebt minder controle over de queries die er uitgevoerd worden.
- Omdat ORMs vaak platform onafhankelijk zijn, ondersteunen ze alleen de gemene deler tussen de verschillende ondersteunde databases. Aangezien vooral MySQL nogal beperkt is in zijn functionaliteit, kan dat vervelend zijn als je iets anders dan MySQL gebruikt
Het belangrijkste bij het gebruik van een ORM is dat je heel goed in de gaten houdt wat er op de achtergrond gebeurt. Je zal anders heel snel merken dat je 100den queries gaat uitvoeren op een simpele pagina. Dit hoeft niet erg te zijn, maar het is handig om rekening mee te houden. Als je ORM goed gebruikt hoeft dit geen probleem te zijn en hoeft het niet veel langzamer te zijn dan eigen mappers schrijven.
Dan heb je natuurlijk ook nog de keuze over welke ORM je gebruikt. In PHP heb je twee verschillende ORM's die veel gebruikt worden:
1. Propel
2. Doctrine
Mijn voorkeur gaat naar Doctrine. Deze is gebaseerd op Hybernate van Java en is zeer flexibel. Het biedt zelfs zijn eigen SQL taal (DQL) die het mogelijk maakt om objecten ipv records uit de database op te vragen.
Haal ORM overigens vooral niet in de war met Active record! Het idee van Active record is dat elk database record een eigen object is. Dit kan in het begin best goed werken, maar op termijn gaat dit alleen maar tegen je werken. Dit omdat de data die je nodig hebt nooit exact de records uit de database zijn, maar de domein objecten. Domein objecten zijn object georiënteerd gemodeleerd. Een database als MySQL is relationeel. Deze modellen werken allebij op een anderen manier. Voor het bouwen van een applicatie is het object georiënteerde model het handigst. Voor het opslaan van data het relationele model. Ik raad je dan ook ten zeerste af om active record te gebruiken!
Echter, voor de poster is zowel activerecord als orm nieuw. De learning curve voor orm is veel steiler dan voor activerecord. Eigenlijk moet je 1 keer in je leven een activerecord implementatie gebruikt hebben, om er achter te komen waarom je dat een volgende keer niet moet gebruiken.
Vandaar mijn voorstel om een proef projectje te doen ;-)