Обычно разработка происходит так:
Сначала всегда все читается из бд и сохраняется в бд сразу. Так проще сделать, сложнее наплодить ошибок, быстрее получится первый прототип, сразу видны узкие места и кривые запросы к бд.
Если в какой-то момент возникает ситуация с очень частым обращением в бд, то данные начинают кешировать в памяти.
Кто-то делает ленивый кеш (На примере сундука и вещей в нем: если в памяти есть данные о вещах этого сундука, то используем их. Если нет, то подгружаем из бд).
Кто-то инициализирует кеш при старте приложения (Грузим данные при старте сервера обо всех сундуках и вещах в них).
Насчет непосредственно работы с бд могу посоветовать глянуть
https://github.com/aaberg/sql2o