Насколько я понимаю, делается примерно так.
Когда динамически создаваемый документ запрашивается впервые, он таки генерируется из базы, а результат - конечный код документа - не только отдается посетителю, но и сохраняется в базе, в отдельной таблице с дополнительными полями, содержащими дату изменения и относительный адрес документа.
Когда документ запрашивается в следующий раз, первым делом обрабатывается
$_SERVER["HTTP_CACHE_CONTROL"] в соответствии с
RFC 2616, Section 14.9, чтобы определить, есть ли у браузера кэшированная копия документа, и насколько она стара.
Если копия у браузера есть и она моложе даты последнего обновления - то возвращается
header("HTTP/1.0 304 Not Modified").
Если копии нет или она устарела, выдается кэшированный код документа из кэш-таблицы.
При изменении документа, для которого в кэше уже есть копия, копия заменяется, дата обновляется. Если копии в кэше нет - то можно ничего не делать, пока документ не будет запрошен впервые (а вдруг он никому не нужен?).
Типа того?