In the database layer we did join the tables based on the ER diagrams. This is where I also removed all determinants, and set all of my query item attributes to unknown or unsupported.
I created a namespace called business views and then created namespaces inside that called sales retail, etc. In the namespaces I created model query subjects based off the database tables. This is where I would resolve loops, combine tables, etc. You would see the same tables referenced in different namespaces, but the joins to other model query subjects might be different depending on the reporting need. Our cardinality would be determined by the reporting and user needs.
Things aren't always smooth, and we spend a lot of time hacking together solutions. You'll find you do what works, but the reason you do it is not always clear.
We didn't do a middle layer per say. Just the database view and business views.
The main thing you need to know, the right way is the way you get it to work. Your going to spend a lot of time building model query subjects, joining them, testing them, and then looking at the data to see if your results make sense.
Sometimes you'll create tables in your namespace that are identical, excpet their joins to a particular table are different.
Be consistent with your attributes throughout all business views, and decide how you want dates displayed and set that consistenly as well. Also, use descriptive names, they help everyone.
If you have more specific questions let me know, it's a lot.