RI stuff almost never works in practice. I've never seen a piece of software the could be perfectly developed from some sort of RI. In fact, that usually ends up being the most bloated and worthless software that I've witnessed.
A DB with normalized data, but without any RI enforcement is going to be more fragile than a flat file DB. It's one of the basic features of the relational model that make it worthwhile. If you need the DB to keep the data matching the schema, and can't trust the application to do it, implementing RI constraints within the DBMS is your best option.
I have no clue what you mean by software being developed from RI, though. Software needs to be developed to be compatible with the mechanisms used to enforce RI, and how it is enforced can be a performance problem to tackle, but it's just an aspect of making a DB be a RDB.
If given the choice, I would choose a hyper-normalized database over a flat database any day of the week. It is stupidly easy to take a overly normalized database and convert it into one that is flatter (essentially, that is what is happening when you do those complex joins). On the other hand, it is nigh impossible to take a DB that is unnormalized and make it normalized with existing data.
Been there, done that, and it was quite tedious
(there were regexes for permissions, too, as I recall). It would not have been worth it if requests weren't timing out just before lunch time, honestly. I did have to resort to using one true lookup table, though, to keep the changes local to the database.
It has little to do with the actual application setup and everything to do with data normalization. Very rarely does the application perfectly model the database.
Nor should it. The DB should model the data with the most convenient set of tables and rules to ensure that it doesn't become in any way garbled by misuse
(flat-file tables with dependent and/or multivalue fields are being misused from the beginning), or made too difficult to extend, later. That was basically the point: the data has a certain level of structure that it must have to be able to guarantee it is correct. Some structure will be based on how it is used, but any tight coupling to how it is used by the application should be avoided, because it trades an easy short-term problem for more difficult long-term problems, even if the application appears to keep data sane and coherent by itself for the moment
(many tables because each new object type gets its own, and many tables to have 6NF, are very different things ).
Not totally. ORMs are made to make converting DB data into objects easy. That is it really. IMO, the "Meanwhile, a little understanding of how the DB is intended to work would usually solve the problem." doesn't solve the issue at all the ORMs are trying to solve. I don't like putting random SQL strings into my language of choice. I don't like that I have to loop through each returned row and decide which piece of data goes where, what to do when something is null, and how to deal with multiple returned selects. It isn't hard to deal with, it is just ugly tedious code.
That is what ORMs try to solve. Yeah, they aren't perfect and they can result in less than optimal select statements and DB structures, but they are there to ultimately cut down on the amount of time a developer has to invest in getting data from the database into a usable state. No combination of views, stored procs, or db structuring is going to solve that problem.
I guess you haven't come across egregious uses of ORM frameworks to make SQL DBs into flat or object DBs...it can be D:. The problem I've seen is that features in ORM frameworks get used to squeeze the DB into a remote cache, rather than treating it like a first-class server that manages databases. The result can be a mire of opaque framework code, and a database with a structure fit for a Great Old One, or [at first glance] random added tables to an existing DB. In either case, trying to add anything useful, or track down bad or missing data, can be a nightmare.
IoW, that it gets used not for the problem of handling a view without SQL statements and for loops littering code, but for the problem that management likes their SQL DBMSes, and the devs either have little to no use for it, or only think in records and/or OO hierarchies, so the DB gets made to fit the way the application organizes the data in its code, or is treated like it should be storing a giant CSV file, with the ORM allowing most of their application code to look rather neat and tidy, despite what is behind it.
A COBOL programmer that can write C# and use NHibernate is a dangerous being
.