Posted by Kamran
Ayub - Thursday, May 6, 2010, 06:24 PM
I think it's interesting; it's too bad we waited
so long to argue about it. Let me say
first off: I understand both arguments. I have my own opinions, but I can
definitely see both sides to this. First,
I think we should establish some FACTS that we can all agree on:
1.
No DBMS currently available (for at least production-oriented
apps) can completely express every business rule we need to express innately.
(Src: experience and Everest)
2.
No matter which way you slice it, business rules eventually
get turned into code somewhere whether it's at the DBMS or in
application logic. At some point, there's a piece of machine language where the
rule is expressed and validated in 1s and 0s.
There,
now that we agree on those two points, what exactly are we arguing about? If you believe Fact 1, then it follows
that it is not possible to ever express all our business rules in the DBMS
(at this current state in time).
Here's my view:
All DBMS do enforce a limited set of business rules. Thus, if you
argue that your application code holds all business rules in one central
place, you are wrong because the DBMS enforces a few of those
constraints (mandatoriness/uniqueness/etc.). Most of us end up duplicating
these rules to avoid catching exceptions, without thinking about it. Secondly, you cannot guarantee that
there is only a single point of entry to your data. Don't argue with me; there is a sysadmin account
somewhere on the system the data is stored and at least that account has
full authority to change the data. How many of us input sample data into our
SQL databases to fix a data error, sample data, or test triggers? Exactly.
Besides, let's not forget you had to define that structure somehow! It may be
true your business users can't access that data directly, but somebody
is the data steward and she has full control, rules or no rules. By the way,
what about unauthorized access? Whoops, guess that hacker didn't
care about all your application-enforced business rules! It's fine if you argue that the
hacker could completely destroy your system but you must agree that if your
logic is stored in the application, at some point due to the nature of TCP/IP
that your data is out in the open between your app and your database. That
could potentially be tampered with, and your application can't do anything
about it.
So now, the argument is not
whether it's better to store business rules in application logic, the question
is why can't we put those rules in the DBMS itself, innately? The answer
to that is simply because no DBMS allows that just yet. The reason I think people argue for storing
rules in the application is simply because there's really no other better
alternative right now. If a .NET developer is comfortable with .NET and not
with T-SQL, where do you think she'll put her business rules? In the .NET
application or some other application gateway (not the DBMS). This is what I
heard today in our discussion. We put all our rules in application logic
because it's the best central repository we have... when really the best
place should be the DBMS. After all, what have we been learning all
along in this class? ORM is able to capture many of these rules... and yet, not
all. Business rules are there to establish integrity with our data so they should
be in the DBMS.
I believe it's useless to argue for or against storing rules in
application logic because right now it's impossible to put them all in the
DBMS. Even if you wrote stored procs or triggers for everything, that's not
enforced by the DBMS innately (triggers are closer to automatic) plus the rules
are still in code. Furthermore, I
believe most people put their rules in application code because it's just
harder to do it in the DBMS and that many enterprise or even regular
applications can target different storage systems (one application could use
XML, MSSQL, MySQL, DB2, or MS Access as repositories). Imagine duplicating all
your business rules across those systems... it's much easier to store the rules
in the code, isn't it? Let me be clear: I
am not advocating that it is right to store business rules in app logic.
I also believe that it is best to put business rules in the DBMS. All I am
saying is, what choice do we have at the moment? Until a better DBMS is created,
preferably using ORM as the tool to create the DB then we're SOL. Let the discussion begin!
EVEREST RESPONDS:
.. I love it. I agree with all you
have said. I just would not characterize it as "two sides of an
argument." Both "sides" must spring from an environment of
understanding of the basic concepts. There are two main traps we fall
into:
1. Believing that someday we can reach the ideal
state of a perfect world. Your discourse is filled with those thoughts,
e.g., "no DBMS currently available..." (implying that one may be in
the future), "at this current state in time" (suggesting that there
may come a time), "no DBMS allows that just yet" (but perhaps a
future DBMS product might?), "right now it is impossible" (with the
implication that in the future it will be), "until a better DBMS is
created" (better yes, but never perfect or complete).
"Man" (which includes woman) is imperfect, and therefore, so are his
constructions, our DBMSs, our databases, our code, our systems. So try as
we might to improve (and we should), we must always be alert to imperfection,
weaknesses, failures, attacks, (whether inadvertent or deliberate, intentional)
and build in countermeasures. That is why we back up our data, build in
redundancy, and why every government (every locus of power) must have "her
majesty's loyal opposition" and the watchful eye of citizens and the
media.
2. We tend to use, to favor that which is more
familiar to us. If we are a programmer and that is what we know how to do,
we will get things done by writing code in our favorite programming
language. If we know how to use the full functionality of some DBMS, then
that is what we will do as much as we can. Some application coders need
to be stretched to consider an alternative way of doing things that might get
us closer to the ideal of serving people (management, organizations) AND
incorporating appropriate safeguards (which also will never be perfect).
.. The business rules and integrity constraints
are those mechanisms that can lead to higher quality data, greater user confidence
(in our databases, our systems, our IT departments, and our organizations), better
decisions, and more effective and efficient operation. As you rightly state,
ALL that happens in a computer system is done by executing code. But that
is only half the story. ALL that executing code is driven by
specifications, definitions, declarations, input parameters, in other words
"data" more broadly interpreted. Even the program code is the
specification of a process. The accuracy and completeness of the process
depends on the specifications, the directives, etc.
.. As I show in my lecture on Business Rules (slides
BRules.23 and .27), there is a hierarchy of levels where this information, the
business rules, can be expressed:
1. DBMS
2. Stored Procedures, whose execution is under
the control of the DBMS.
3. Code (methods) embedded (encapsulated) in
"objects" which execute in a well-managed and controlled environment
(OO, SOA, SaaS...)
4. User application code
5. External user actions (manual or sysadmin)
.. At all these levels the processes are driven
by definitions, specifications. The efficacy of those processes depends
on those specifications, and we (humans) understand those processes through
documentation which itself is usually quite imperfect.
.. Moving down these levels we encounter
decreasing levels of control and increased dispersion. I put DBMS at the
top, because that is the closest to the data and the most likely centralized
point of control (least dispersion). Our objective is (or should be) to
move these boundaries down so that work gets pushed up into more controlled
environments. Another thing that happens as we move through these levels
is increasing abstraction. When we declare database integrity
constraints, that is a specification (abstraction) of some underlying process
(executed by code... somewhere). We (humans) do not need to know what goes
on under the covers, we merely need to have confidence that it will be done
correctly and consistently, as reflected in the definition or
specification. For example, we may understand the meaning of the square
root operator, but how it gets executed on a computer is quite complex. I
want to be hidden from that complexity. When we write a program we call
all sorts of subroutines or functions, which are defined at a pretty high level
(of abstraction).
.. To the comment of "too bad we waited so
long": The focus of my course is data modeling. The subject of a
companion course would be DBMS and Database Administration. This issue we
are discussing would properly belong in the second course. However, I
raise the question here because the success of maintaining the integrity of our
databases according to our defined semantics depends upon the execution
environment, the DBMS ++.
.. Let the discussion continue.
No comments:
Post a Comment
Comments to any post are always welcome. I thrive on challenges and it will be more interesting for you.