In my opinion, the best practice is 1-tire model. That is, connect to the data source, load the data, build data model, create front end. All in one application.
In some cases, 2-tier makes sense. For example, if you have multiple essentially different applications but all built from the same data sources - and at the same time it is important that there is no difference in data due to the changes in source between the reload time of your different applications.
I can't think of a situation where 3-tier model may be necessary. I'm not saying that it may never happen, just that I never needed in my many years of QV work. If it is needed - it is not a "best practice" but rather a "special need".