I use MLDBM to store a fairly nested hash and it works rather well. Two points to consider:
1. USE STORABLE not Data::Dumper!!! Storable is about an order of magnitude faster for my tasks. The serialization package that MLDBM uses is customizable. See the docs.
2. Consider your memory needs. I've found that not only does the serialization package incur a signifigant memory overhead (Data::Dumper being the worst offender as far as I can tell), MLDBM adds on another 10-20%.
The widom to consider SQL is valid. Take a look at DBIx::Recordset for a module that will allow you to work with the your database using native Perl hashes and not have to mess with DBI or SQL ugliness.