Detailed info:
An ORM (Object-Relational Mapping) is a tool that lets you query and manipulate data from a database using an object paradigm.
It's a completely ordinary library written in your language that encapsulates the code needed to manipulate the data, so you don't use SQL anymore, but directly an object of your language.
E.G., a completely imaginary case with a pseudo language :
You have a book class, you want to retrieve all the books of which the author is "Linus". Manually, you would do something like that :
- book_list = new List();sql = "SELECT book FROM library WHERE author = 'Linus'";data = query(sql); // I over simplify ...while (row = data.next()){ book = new Book(); book.setAuthor(row.get('author'); book_list.add(book);}
With an ORM, it would look like that :
- book_list = BookTable.query(author="Linus");
The mechanical part is taken care automatically by the ORM.
Pros and cons
Using an ORM save a lot of time because :
- DRY : You write your data model in only one place, it's easier to update, maintain and reuse the code.
- A lot of stuff is done automatically, from the database handling to I18N.
- It forces you to write MVC code, and in the end your app is cleaner.
- You don't have to write poorly formed SQL (most Web programmers really suck at it, because SQL is treated like a "sub" language whereas it's a very powerful and complex one)
- Sanitizing, using prepared statements or transactions are as easy as calling a method.
- It fits in your natural way of coding (it's your language !)
- It abstracts the DB system, so you can change it whenever you want.
- The model is weakly binded to the rest of the app, so you can change it or use it anywhere else.
- It let you use OOP goodness like data inheritance without head ache.
- You have to learn it, and they are not lightweight tools;
- You have to set it up. Same problem.
- Performances are ok for usual queries, but a SQL master will always do better with his little hands for the big dirty works.
- It abstracts the DB. While it's ok if you know what's happening behind the scene, it's a trap for the noobs that can write very greedy statements, like a heavy hit in a for loop...
Well, use one. What ever the one you choose, they all use the same principles. There are a lot of ORMs around here :
- Java : Hibernate.
- PHP : Propel or Doctrine (I prefer the last one).
- Python : the Django ORM or SQLAlchemy (The last one is my favorite ORM ever).
No comments:
Post a Comment