Generally I try to avoid using session data except where necessary;
1. Session identifier
2. Flash data
3. Temporary data
Shopping carts are an interesting example of where storing them in the DB can be preferred. If you generate a fingerprint for an anonymous user and store their cart using that fingerprint (or their ID if they're signed in), if they return to your site you can preload their cart with the items they had selected. You can also query your temp carts to see what items people are adding and abandoning.
You could store that in cookies but personally I've found them unreliable so I avoid using them. And you can't query abandonment.