Why Normalization Failed to Become the Ultimate Guide for Database Designers?
lambda-the-ultimate.org
lambda-the-ultimate.org
Another opposing force is real-world performance. In most cases we're fine with a non-perfect model, we're fine with duplicated data, and we're fine with inconsistent data, because the problems they cause are much easier to deal with than performance bottlenecks. Having a slow frontpage because getting your inventory list requires a five-way join is gonna put you out of business really, really fast.
Regarding performance optimization, I think it is valuable to distinguish between the logical model and the physical model. Any kind of caching is a kind of redundancy, but that is not a problem if the database engine guarantees the integrity of the logical model. Relational database engines provides ways to optimize the physical storage and querying of data without compromising the logical model. For example materialized views can provide the same kind of optimization as a denormalized table in the 5-way join case - but without the integrity issues.
the more normalized your database model is, the harder it is to change that to reflect your new business needs.
Like Olavk said,this is not my experience. It is easier to start with a normalized database and adjust. Now when adjust I sometimes have permitted exceptions to the normal form to minimize the number of code changes, but I always prefer to start normalized even if he does not stay that way.
we're fine with inconsistent data,
In the databases I have worked with, this is absolutely never acceptable. I know in some areas it may be, but not where you really care about being right. Every application I have been a DBA for has wanted all of its data to be correct, and if it is inconsistent you know that some of it is wrong. As a DBA I certainly could not guarantee that the data was correct, but I could normally guarantee that it was consistent and that helps.
except performance problems, of course.
Well, in some ways, even those can be solved with abstraction. The key is where that abstraction layer is placed. :) The assumption is you add them "on top" of what came before; but if you go in the other direction you may be able to improve performance by implementing, say, a smarter CPU with higher level abstractions built into the silicon. Things like that.
If you think of programming in mathematical terms, it's almost like you're the polar opposite of the pragmatic practitioner. This whole idea of a perfect form is inane. Relational set theory gives us conceptual ways of talking about constructs. It's a tool, not a way of life. Somebody build a bad relational model? Well -- what do you mean by "bad"? Did the resulting code achieve the goals set at the beginning?
And when I got to the point in the abstract where it said no books had shown how to use it well, I was ready to bail out. I'm not sure what books the author has been reading. The ones I've seen have practical real-world examples of normalization all through them.
I would definitely opt for that as a "real-world" practice.
- id, nick, mail, pwd, time, mytwithere
- id, nick, mail, pwd, time, anothertwithere
- id, nick, mail, pwd, time, mythirdtwithere
- id, nick, mail, pwd, time, mylasttwithere
hmm, no, that won't worknormalization still wins