I agree with the substance of your reply. In particular, people who deviate from normalization without understanding the consequences of their actions are often painting themselves into a corner. Or more likely, painting their successor into a corner.
But good designers sometimes deivate from normalization fully cognizant of the downsides, and willing to live with them.
It once was pointed out to me a specific case in which this happened, and the guy who did it explained exactly what issue he was addressing in doing so.
The programmer-cum-DBA in question here was a self educated redneck with absolute disdain for all acedemic terminology and tools that were brought out after about 1982. He didn't even do SQL - he used an ISAM record management library for all of his stuff.
He built line of business applications for a few local manufacturers and distribution companies.
We were talking about data normalization. He walked through his table design for customers, invoicing and billing. He showed me one table where he captured every detail of the "header" for an invoice, which included the name, address, and contact information fields for the destination customer, as literal data, not as foreign keys.
Note that he already had this information in the customer table(s). I challenged him on this sloppy approach of smearing the same data across two or more tables.
He "corrected" me as follows. The table of generated invoices reflected every customer's then-current location. If he embedded a foreign key to take the place of the expanded customer information in every invoice, the customer would have the problem in the future of not being able to recall or reconstruct specific invoices, in the event that the customer moved or changed their information. Also it was a legal thing - this table was proof that an invoice
was generated, to that customer at that address and with that contact info. As well as being a tax law thing. Again, the table of invoices could be treated like an archival view of the data.
I think he also expanded the list of invoice items and snapshotted them at the time of invoice generation instead of relying on foreign keys for inventory items, too.
I suppose that if you wanted to elaborate such a design to take this into account, you could have versioning of any fields that were subject to change. But that is a much higher order of complexity than just snapshotting the data in a non normal way. I suggested this to him and he scorned the added complexity. His design had been proven by deployments in half a dozen companies and every customer had been absolutely satisfied with his approach.
I was pretty impressed at the time with how such an elegant academic and applied concept - normalization - falls apart in certain real world cases. At least unless you wish to create an enormous additional layer of complexity to cope with the "non normal in practice" data to make it normal, too.
I also agree with you that "future proofing" a database design is one of the most challenging aspect of this business. However, that has to be understood in the light of Gorn's comment in another thread, where the ease of using DB technology in single applications has given rise to the embedded database. If a database is embedded inside an application that is not to be future proofed, then future proofing the database is a pointless exercise.
This is a good statement of facts. Every application is not the rock of ages and its data doesn't have to integrate.