Делаю проще. Есть прописанный набор допустимых размеров. Это чтобы отсечь неадекватные запросы.
При запросе картинки если ответ 404, то обработка передаётся бэкенду. Запрос идёт вида
http://site.ru/uploads/images/a03/cc5/a03c...5_thumbnail.jpg Из запроса видно, что требуется от оригинала a03cc5015cc7393a3417aef487a5cfb2.jpg сгенерировать тумбу (изоюражение, вписанное по меньшей стороне в размеры с обрезкой большей стороны) с размерами 204х145 и имеется имя оригинала. Тумба генерируется и сохраняется по указанному адресу. В следующий раз запрос до апача даже не доходит и файл успешно отдаётся nginx или лайти каким-нибудь. Таким бразом, если требуется изменить размер или способ формирования картинки, достаточно внести допустимые параметры в общий вайт-лист и поменять шаблон - картинки буду генериться по мере необходимости автоматически. Такой подход использую довольно давно и в целом он выполняет свою задачу оцень хорошо.
В базе есть табличка с именами оригиналов (найи и удалить оригинал и все его копии можно по маске), типом сущности и идентификатором. Обычно типом сущности является табилца, а идентификатором - идентификатор элемента в этой таблице. Т.е. есть товар в табице goods с id 100500 и у него есть несколько изображений, находящиеся в общей таблице изображений с типом сущности goods и идентификатором сущности 100500. Все выборки удобны, работа в целом понятна и удобна. Важно понимать, что имя изображения в таблице изображений не может быть уникальным т..к одна картинкаа может соотетствовать разным товарам и даже разным типам сущностей. Теоретически это может привести к проблемам при удалении - надо проверять, нет ли ещё завязок на картинку, но на практике просто отказался от физического удаления файла. Мето при нынешних ценах на железо реально резиновое :)