SQLServerCentral Article

Where Logic Lives

,

A Response to: Ken North’s SOA, Multi-Tier Architectures and

Logic in the Database

I have read several articles over the last several months on the topic of

business logic and where it should live. In a recent article by Ken North (http://www.sqlsummit.com/Articles/LogicInTheDatabase.HTM), he made a case for

placing a majority of the business rules and logic in the database as a means of

simplicity, consistency and data integrity. Ken makes what I think most would

agree are very good points. I can also tell you from experience that over time

Ken’s theories on the advantages of this type of model will be proven wrong or

at best cumbersome and clumsy.

While I agree that developers are under more pressure than ever to deliver new

features, new applications, and even new products to management in less time

than ever before. It is precisely this reason that I disagree with Ken on every

level possible.

A database can be a lot of things as we know and now more than ever the types of

thing a database can store is mind blowing. Thinking about storing images and

XML documents several years ago was unheard of. I, much like many DBA’s and

developers, can think of many situations in the past where that would have been

much easier to place the logic in the database as opposed to doing the

programming required to accomplish the same thing. It is at this point, however,

that I am reminded of something my father Kevin told me a long time ago. “Son,

just because you can do something doesn’t mean you should” and “The easy way is

almost always the wrong way” and finally “all things in moderation” or was that

Ben Franklin. Now I will acknowledge that Dad didn’t intend for these sayings

to be a guide for me in my future database endeavors (Dad didn’t have database

classes in the one room school house which he walked 20 miles to in six feet of

snow, uphill both ways….but I digress). But allowing for the possibility that

dear old dad knew what he was talking about I would like to present a few

reasons as to why placing logic in the database is a bad idea.

I will acknowledge how tempting putting logic in the database is. Having a

central location, consistent logic, data integrity and the like are all good

arguments if you are building a database that is going to be used by a known

number of users and the content will be largely static. As we all would agree,

both of these ideas requires that we live on some planet other than this one.

The fact of the matter is that in most cases databases are designed to do one

thing and then asked to do several others. Any DBA who has been around for more

than a week has experienced this. As painful as it could be from time to time

it was still just adding data, new columns, new tables, and even new databases.

Now we have stored procedures and indexes and views and functions and stored

procedures that call functions that reference indexed views. How great is that?

We can add this here and that there and before you know it, all of your logic

ends up in the database.

It is later on in this process that the things begin to sway the other way.

What was once an easy place to put some logic has become a tangled web of

different logic for different things that are so specific that they can’t be

used for anything else. Now adding something means adding something specific.

Every new release or update requires dozens of new stored procedures on new

tables and new views with new indexes and although the developers may be working

on the same “project”, the reality is they are not by nature good at sharing or

thinking about ways in which they could leverage something that is already

there. If I had a quarter for every time I heard “I can’t use that because it

returns A and I need B" that, well you know the rest.

The main problem arises is performance degradation. Good luck optimizing a

server that contains oodles of business logic. I am often asked to tune a

database in this environment and I always tell them the same thing. I will do

what I can and you will be better than you were, but in a couple of –insert time

frame- you will be calling me again. That’s because you will always bump up

against server side limits that application servers just don’t have. In the

simple fact that you do all of you calculations or applying rules or stripping

and formatting data on the fly requires overhead and resources that database

servers are not created to do efficiently. Can it do them? Of course it can

and SQL Server is the best at it, but it still isn’t what is designed to do and

because of that it will always be more inefficient than doing the same things

programmatically.

Flexibility decreases as logic increases. If you are doing all or your

formatting in the database, then when you need to add features that allow you to

do business in another country or you are asked to perform internationalization

work, you have to go and duplicate almost everything that you need in each

language that you need it. Again, more data and more overhead to process that

data along with formatting and making sure it is used in the specific instance

it was logically designed for is going to result in a resource shortage at some

point. A database shouldn’t care about language or format or any of that. It

should return data that developers can use to format and display in any way they

like. By placing logic in the database you take away the developers ability to

do just what you are asking them to do, be flexible and fast.

Lastly and most importantly, databases don’t scale. Once you reach the limit,

you are done. You can only add so much RAM or so much processing power. You

can only tune a stored procedure so much when it is asked to perform logical

operations to return specific data. Say it with me “Databases don’t scale,

application servers do.” You can split and divide and add to application

servers from now until the end of time. Not so much with a database. You can

do lots of things many more than I have mentioned above, but I promise you the

day will come when you will hit the wall. Maybe it will be when you’re asked to

do the same stuff you do on MSDE on SQL Express with a larger database limit but

a smaller RAM limit which is right around the corner. As a database architect I

am looking very much forward to the release of Express as I know may customers

who have been tuned to the utmost, by me or others, that are at limits they

shouldn’t be at because of logic in the database. Losing a gig of cache is

going to be something that pushes their performance meter over the edge.

In closing, I understand that some of this may seem counter intuitive at first,

but give it some thought. I also understand that this would seem to fly in the

face of what Microsoft is trying to accomplish with the integration of the .NET

CLR and SQL Server 2005, but I haven’t seen one thing that leads me to believe

that there intent is to have logic live in the database. I could be wrong as

the jury is still out on that one and no one seems to have a clear picture of

the cost/benefit of such a model. I can tell you from experience that some

logic in the database is ok, but to intentionally put it there is asking for

trouble. And you know what Dad said about trouble “Son, you never have to go

out looking for trouble, it will find you on its own.”

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating