Just adding a little bit of my practical experience to this topic. I inherited a weakly developed data model with direct table access scattered throughout front end and middle tier code. Imagine my frustration when a new business request came in that required new columns be added to a user table. My first thought was "How the heck can I add these new columns and not screw up the application at the same time?". I don't know where every single nook and cranny is and SELECT * calls were all over the place. In fact, there had been so many developers who had passed through over the years, no one knew where all the land mines were. My solution was to mimic what Microsoft did to their SQL Server 2000 system tables in SQL Server 2005 - I turned these core tables into backward compatability views I then created new versions of the tables with the new columns and used the backward compatability views to reference the new table which returned a resultset and column list consistent with the original version of the table.