Here is what we are doing (best practice or not, I am not sure)
Every night a script runs and dumps all our site collections to disk via STSADM -o backup
Then Our backup software backsup the app server (incl these files) to tape. This allows us to do site collection level restore if needed. We generally will restore to our test server and let the user pull what they needed.
Our backup software also backs up the SQL DBs (via Veritas SQL Agent)
While our current process works decently, it is not granular enough for me. We are in the process of implementing Veritas SharePoint agent, which will backup the entire farm each night and allow for restores all the way down to the item level.