Какие компромиссы вы ищете? Если вы готовы смириться с небольшим снижением производительности при вставке этих объектов, вы можете создать решение, которое позволит быстро получить N из них.
Вот что вам нужно сделать:
Когда вы вставляете свои сущности, укажите ключ. Вы хотите дать ключи своим сущностям по порядку, начиная с 1 и далее оттуда. (Это потребует некоторых усилий, так как движок приложения не имеет автоинкремента (), поэтому вам нужно отслеживать последний идентификатор, который вы использовали в каком-то другом объекте, давайте назовем его IdGenerator)
Теперь, когда вам нужно N случайных объектов, сгенерируйте N случайных чисел от 1 до любого последнего сгенерированного вами идентификатора (ваш IdGenerator будет знать это). Затем вы можете выполнить пакетное получение по ключу, используя N ключей, что потребует только одной поездки в хранилище данных, а также будет быстрее, чем запрос, поскольку получение ключа обычно выполняется быстрее, чем запросы, AFAIK.
Этот метод требует обработки нескольких раздражающих деталей:
- Ваш IdGenerator может стать узким местом, если вы вставляете множество этих элементов «на лету» (более нескольких секунд), что потребует какой-то осколочной реализации IdGenerator. Если все эти данные предварительно загружены или не имеют большого объема, вам будет легко.
- Вы можете обнаружить, что у некоторого идентификатора больше нет сущности, связанной с ним, потому что вы удалили его или потому что где-то произошел сбой пут (). Если бы это случилось, вам пришлось бы схватить другую случайную сущность. (Если вы хотите проявить фантазию и уменьшить шансы на это, вы можете сделать этот Id доступным IdGenerator для повторного использования, чтобы «заполнить дыры»)
Таким образом, вопрос сводится к тому, насколько быстро вам нужны эти N элементов по сравнению с тем, как часто вы будете добавлять и удалять их, и стоит ли небольшая дополнительная сложность для повышения производительности.