Ваша структура достаточно эффективна для кэширования, но я бы не стал использовать это в критически важных местах. Если ваш кэш увеличивается, и у вас есть 5000 элементов в одном месте, вы все равно выполняете линейный поиск по 5000 элементам.
Я думаю, что лучше отсортировать список и использовать двоичный поиск для поиска элементов в кэше.
Если бы я реализовал что-то подобное, я бы взял TList с указателями на записи. Список, который будет отсортирован с помощью TList.Sort, который я даю процедуру, которая сортирует список в соответствии с данными, содержащимися в записях. Сортировка будет производиться на полях с наибольшей «селективностью», затем на полях со второй по селективности и т. Д.
Если вы хотите найти запись, вы выполняете двоичный поиск в списке и получаете значение, если оно не существует, вы получаете его из базы данных и добавляете его в кеш.
Конечно, все это было бы красиво обернуто в классе, который заботится об этом и о проблемах выделения памяти.
Хеш-карта также возможна, но вы должны выполнить тесты, чтобы увидеть, что быстрее.