views:

209

answers:

8

I've not started the ORM trip yet,

because I'm not sure how it works when the project becomes very complex.

What's your opinion or experience?

+4  A: 

When project becomes more complex it is even better, because it let's keep everything at the same level of abstraction, rather than jumping from objects to SQL. We once have written our own layer in paralell to developing the application (because we couldn't use any traditional ORM), and the more powerful it became, the easier managing application become.

EDIT:

Performance concerns are you usually overrated ;-) It's usually in different place, then you would expect. We had some badass abstraction layer written in Python, and it working great. What sucked, was url library, which we had to rewrite in C. Really, you can always optimize queries, that are most important at the end, writing SQL by hand at the moment, when you see, that performance needs it. But in most times - you won't have to :-)

gruszczy
I know it'll speed up developing,but how will the performance be?
ORM speeds up performance also usually. For example, the ORM I'm most used to is Hibernate. Hibernate does a good job about creating the most efficient SQL under the covers to accomplish what you need.
SOA Nerd
+1  A: 

In my opinion ORM built for big projects, to minimize effort and development time.

But if you are developing an application which needs very high speed data access code, you need to avoid ORMs as you can because ORMs add a new layer in your application

Amr ElGarhy
+4  A: 

This is subjective. My answer is specifically about automated ORM Tools.

I have a philosophical objection to ORM Tools for the following reasons:
1- A table is not and should not necessarily be a one-to-one mapping to a business object.
2- Base CRUD/Business Object code is boring to write, but it's critical to your application. I'd rather be in control and have knowledge of it. (a little NIH syndrome)
3- A new developer coming in is going to have an easier time learning a traditional object model versus whatever bizarre syntax is created by the ORM tool.

Jacob G
+3  A: 

ORM. by defintion, is object-relational mapping.

This means that you should transform the data stored in a relational database into the objects usable by an object-oriented programming language.

The objects may supply some methods that may involve data processing and searching for the other objects.

This is where the problems begin.

The data processing may be implemented on the ORM side (which means loading the data from the database, applying the object wraparound and implementing the methods on the programming language you use), or on the database side (when the data processing commands are issued as a query to the database).

Compare this:

MyAccount->Transactions()->GetLast()

This can be implemented in two ways:

SELECT  *
FROM    Accounts
WHERE   user_id = @me

into $MyAccount

, then

SELECT  *
FROM    Transactions
WHERE   account_id = @myaccount

into a client-side array @Transactions

, then $Transactions[-1] to get the last.

This is inefficient way, and you'll notice it as you get more data.

Alternatively, a smart ORM can convert it into this:

SELECT  TOP 1 Transactions.*
FROM    Accounts
JOIN    Transactions
ON      Transactions.Account = Accounts.id
WHERE   Accounts.UserID = @me
ORDER BY
        Transactions.Date DESC

, but it has to be a really smart ORM.

So the answer to the question "whether to use an ORM or not" is the answer to the question "will my ORM allow me to issue set-based operations to the database should the need arise"?

Quassnoi
What is the candidate for really smart `ORM` that will never make mistake?
@user198729: this is yet to be written. Even the database optimizers make inoptimal decisions.
Quassnoi
Linq to SQL/Entity Framework are able to handle this simple join/where case optimally. Of course, there are many, many more situations in which they produce sub-optimal or downright terrible SQL.
Aaronaught
+1  A: 

ORMs are ideal for large projects because they provide a layer of protection from changes on the database side, and speed up the process of adding new features. If performance becomes an issue, you can use a different method to get to your data at the query where you encounter a bottleneck, rather than hand-optimizing every query in the application.

Dan Monego
What are the **different method** you mentioned?
In my case, mostly stored procedures. It might seem inelegant to bypass the ORM layer in some cases but not others, as a practice it's just like any large application - stick to your design whenever you can, and switch to sections of highly bummed code only where it would give you a real advantage.
Dan Monego
But in most cases it won't be that easy when you already used a framework...
You can still use the methods that you're using now - using them doesn't become any more difficult than it already is.
Dan Monego
+2  A: 

You don't mention what platform you are using, but if I wanted to read a record from a database in .NET without using an ORM, I would have to:

  1. Read a Connection String
  2. Open a Database Connection
  3. Open a Command object against the connection
  4. Read my Record (by execute a SQL statement against the Command object)
  5. Transform that Record to an object in my language of choice
  6. Close my query
  7. Close my connection

Sound complicated? An ORM does all of the same things automatically under the covers, and I only need a few lines of code. In addition, because the ORM has knowledge of your data model, it can sometimes perform optimizations such as caching and lazy loading.

Robert Harvey
But, to be fair, on a large project, you're probably only going to write code to support numbers 1,2,3,4,6,7 once and you'll just need to write your queries and your object hydration code.
Jacob G
@Jacob: I suppose you could encapsulate those behaviors, but you are essentially writing your own ORM at that point.
Robert Harvey
@Robert: True. I tend to equate "ORM" with "Automated ORM Tool" when someone asks about my opinion on ORM.
Jacob G
+4  A: 

This question is a difficult one to answer sometimes. You may have heard of the Object-Relational Impedance Mismatch before; that is the issue that ORM tools attempt to solve, but it is fraught with problems. It is one of those situations where you can solve 90% of the problem in a very short time, but every additional 1% from there on up seems to increase exponentially in complexity because of all the dependencies.

An ORM framework is an abstraction, and becomes a leaky abstraction at several points:

  • Complex queries/scripts involving concepts like UDTs, CTEs, query hints, temporary tables, windowing functions, etc.

  • Performance-optimized queries. As Quassnoi mentioned in his answer, ORMs are getting better at this but frequently generate sub-optimal queries, and sometimes the effect is extremely noticeable.

  • Transaction management - the Unit-of-Work pattern can only get you so far when you have to deal with large batch updates.

  • Cross-database or cross-server actions. There are workarounds, but they are just that - workarounds. No ORM I've seen really handles this well.

  • Multiple-table inheritance - this is the only form of inheritance that is actually normalized, and it is really not that hard to manage using pure SQL and manual mapping, but O/R mappers are lousy at it. For many of us, single-table inheritance is not an acceptable alternative.

Those are some of many areas where O/R mappers seem to fail us. Having said that, this does not mean that O/R Mappers are not "fit" for large projects.

In my opinion, ORM in general and O/R Mappers specifically are almost vital for large projects. They save enormous amounts of effort and can help you get an application out the door in a fraction of the time it would have taken you otherwise. They just do not solve the whole problem. You have to be prepared to profile your application to see what the ORM is really doing, and you have to be prepared to drop back down to pure SQL when the situation calls for it (i.e. in several of the situations above).

Some frameworks, such as Linq to SQL, expect you to do this and give you ready-made facilities for executing commands or stored procedures on the same connection and in the same transaction used for the mapper's "regular" duties. L2S is not the only framework that lets you do this, but several are more restrictive, and you end up jumping through many hoops to get what you need. When choosing an ORM, I think that the ability to bypass the abstraction is an important consideration, at least today.

I think the best answer to this question is: Yes, they are fit for large projects, as long as you do not rely exclusively on them. Know the limits of your ORM tool of choice, use it as a time-saver in the 90% of instances when you can, and make sure you and your team understand what's really going on under the hood for those instances when the abstraction leaks.

Aaronaught
A: 

ORM's are cool if you want to pump out web app's quickly to do customer development and see if people actually use your product.

http://www.youtube.com/watch?v=uFLRc6y_O3s

The very last topic that Josh Berkus discusses is "Runaway ORM's". Check it out at 37:20.

WarmWaffles