I'm sure many web developers are familiar with MySQL's WorkBench product. It let's you visually design your database by placing table entities on a stage, and specifying relationships between tables. This is very convenient especially in the design phase of a project.
For my latest project, I started using the nacent MVC PHP Framework known as Symfony. The latest production version of Symfony, 1.4.x, is quite stable, and has good documentation and a solid developer base. While still being very well integrated with databases, Symfony and other modern MVC frameworks don't deal directly with a database. Instead, it uses what's called an ORM, or Object-Relational Mapping software, and a DAL or Database Abstraction Layer.
The DAL is of the least concern to me as a web developer because it provides and important but transparent role. Basically it allows the ORM to communicate with many different types of databases, be they MySQL, PostgreSQL, SQL lite, MsSQL, Oracle, etc, etc.
What is very important to me is the ORM. There are many ORM's out there, and two of the biggest ones in PHP (and also which integrate nicely into Symfony) are Doctrine, and Propel. I've been using Doctrine 1.2 for our project here, although we may move to version 2, as it has been release in stable form and offers some significant improvements.
Another big advantage, besides database agnostic, is that an ORM is no longer table-centric, but model-centric. It is much easier to work with data in an object-oriented way. Instead of doing something like
SELECT * FROM PERSON
you can basically say
$guest = Doctrine_Core::getTable('Person')->createQuery()->execute();
and then you will be able to say something like "print $guest->getName()"
This model/OO way of doing things is even more useful when you start incorporating associations, such as one Person can have many PhoneNumbers.
Another great thing about Doctrine and other ORM's, is that you are not as limited to the particular flavor or capabilities of the database solution that you are using. Because Doctrine operates at a higher level than the DB, it can keep track of certain things independent of the DB, which let's you do some really nifty things, like what Doctrine calls "Behaviors".
One example of a behavior is the SoftDelete feature. By specifying that a model has SoftDelete, whenever you "Delete" a record of that model, it will not actually remove them from the table, but instead simply mark a "delete_at" flag. When you later on retrieve records from that model, it will Not include this delete entry. This is all done without the programmer having to add any additional functionality!