Hi Seref,

> I've just started a small web app, and I am using an ORM product for DB
> access, which is what I have been doing for the last 5 years. In the
> beginning I had my own solution, but after leaving the company I wrote it
> for,  I did not take the code with me, and great products emerged for .NET
> like llblgen.

        :)

> The thing is, for a small project, it is almost inevitable for a developer
> to quickly create a db schema, generate sql statements from the db design
> tool, and create the db, which if followed by reverse engineering the db
> with orm tools, and bind it to UI. It is the kind of thing that I've done
> maybe a hundred times or more.

        Not only in small projects. Often a team contains one or more DB
architects who are in charge of designing and maintaining the db schemas.

> The thing is, when I start with use cases, and a domain model that does not
> include any concerns for persistence, the results are different. The uml
> diagram I'm looking at uses inheritence, design patterns etc, and if you do
> not think about  persistence, the look of the code that uses this model is
> quite clean. It is more maintainable too.

        true, from a code perspective.

        Though, one thing has to be realized: if you design a class hierarchy
like Person <- Customer, Person <- Employee etc., these types didn't fall out
of the sky: they're physical definitions of abstract entity types, projected
onto program code.

        This means that it doesn't matter if you write a person and customer
class or that you create a person and customer table: both are projections of
the same (!) abstract entity. The thing is: an abstract entity is a definition
of something which is recognized in reality. How you create your code to deal
with this definition is up to you, however it's wrong to ignore the fact that
the entity is simply something that is recognized in reality, so modelling an
entity model is really just modelling what's already there: reality contains
these entities already.

        If a class diagram is created which contains different types than the
ones recognized in reality, it simply means a conversion has to take place.
Too many times developers assume that this conversion takes place in an O/R
mapper layer, but that's a mistake: the conversion has to take place inside
the code: the conversions I'm talking about are actually projections: from one
domain to the other. If the conversion doesn't take place, you can't talk
about 'customer' in the context of the program and if the conversion isn't
recognized as something required, one also can't talk about 'customer' in the
context of reality. And especially that second part is where things go
horribly wrong in a lot of application which consume databases.

> Now this is a clash between two different approaches, where domain info is
> modelled first in db or in a domain model. The question is, what is the best
> way to merge these approaches? I am really happy about using benefits of OO
> in the domain model, but at the end I find myself writing a "manager" layer
> which connects domain classes to orm generated classes.

        As long as your application logic deals with entity types which are
simply a physical representation of the abstract definition, you can make
decisions based on these entities with rules as recognized in reality, e.g.
based on interviews with the client, research of the organization the
application is for etc.

        The advantage of having entity types which represent elements
recognized in reality is that your code mimics that of what should be done in
reality / is done in reality as well. I.o.w. you can reason about what the
logic should be done by simply looking at reality and how processes work,
should work, how information streams run, what information is available etc.

        Nowadays this is called 'domain oriented', in earlier days there were
different terms, but they all come done to the simple fact that one should
recognize what reality contains about the subject at hand and use that
information as the base of the software to build.

        Never ever fall into the trap that the class model is the
representation of a) reality and b) what should be done to make the software
behave in reality as required.

> I am not sure if ORM should be responsible for more than eliminating the gap
> between relational paradigm and OO paradigm, and you see all these resources
> referring to ORM classes as domain classes. Check out any OO design resource
> or course, and you'll see that the modelling of a domain is rarely performed
> in DB world, where schemas and allowed db types are your building tools.
> Eclipse Modelling Framework seems to have a binding to Hibernate for
> example, which is a clear indication of seperating domain model from ORM
> classes, and I think I am in favor of this approach, for it allows me to do
> the design based on OO approach, and it also gives the benefit of being able
> to isolate myself from sql.

        Though, it's nothing more than dealing with the overhead of text-based
code which is a projection of the functionality required: if the paradigm of
the code changes, if the language changes (e.g. from C# to haskell), the real
program, the solutions to the problems recognized, the functionality required,
the entities recognized in reality which are the ones to deal with aren't
changing one bit.

        Thinking in C# statements too often makes people think that what
they're typing in is the solution, is the functionality, are the
datastructures required, but they're projections of the solution,
functionality and datastructures required. Because they're projections, your
main focus first should be on the source of these projections, which is what
we're today call the domain model, entity models etc.

        And these have little to do with code, class models and the like.

> On the other hand, ORM based approach simply works! I think I'm more
> inclined to accept ORM (generated) classes as domain classes when I'm under
> time pressure and the app is small, and writing down the connecting layer
> between domain and orm layers when I have more time and the project is
> larger.
> I'd love to hear what you think about this. How do you draw the line? Which
> approach is common in your shop?

        I wrote a couple of articles about this subject, one is in Jimmy's
book: 'The datamodel is the domain model' (I always love the reactions of
code-junkies when they see the title ;)) available here:
http://weblogs.asp.net/fbouma/archive/2006/08/23/Essay_3A00_-The-Database-Mode
l-is-the-Domain-Model.aspx
        and I rehashed it abit in different wording here:
http://weblogs.asp.net/fbouma/archive/2008/05/19/why-use-the-entity-framework-
yeah-why-exactly.aspx

        In v3 of LLBLGen Pro we'll do both approaches, model first (dbschema
follows entity model) and dbschema first (entity model reverse engineered from
dbschema), which both come down to simply build an entity model + mappings +
dbschema model, and it doesn't really matter which side you started, you'll
end up in that state anyway. Nice thing is that you can directly communicate
with domain experts _and_ database schema experts at that level, as it's the
abstraction level already defined a long time ago in for example NIAM/ORM
(object role modelling ;)), Yourdon and later on in a set of different names
by Evans.

                FB

------------------------------------------------------------------------
Lead developer of LLBLGen Pro, the productive O/R mapper for .NET
LLBLGen Pro website: http://www.llblgen.com
My .NET blog: http://weblogs.asp.net/fbouma
Microsoft MVP (C#)
------------------------------------------------------------------------

===================================
This list is hosted by DevelopMentor®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to