Regarding "changing a table", once it is populated with data, existing columns are not altered that much due to potential conversion effort. This factor tends to limit changes to existing columns, for good or bad.
Huh? Wha?
I dunno anything about your work environment, but I can say that we alter tables to add and remove columns with just about every release. I'm in charge of the release process here, and we're constantly making changes to our data structure.
As the system is enhanced, or features requested, we realize that it's easier to simply add a column to AnyGivenTable than to add a new table where the necessary data doesn't make sense.
Granted, that's not always the case, and I'm not saying that we don't add tables. But if it makes sense to add a column to a table, then by all means, add it. Or take it away. Whatever makes sense, and provides the feature requested.
Where do we have to change our code? All of our SQL calls are either in .properties files (for our Java GUI-based client) or in stored procedures on the server. Does that mean that I've got 2 places to make changes? Yep. But I'm
changing the data structure, which inherently means that I will need to make changes to anything that accesses the tables in question and requires access to the new fields. Thankfully, our access points into the database are well encapsulated into .properties files. :)