Сценарий
Допустим, я храню до 5 байтовых массивов, каждый по 50 КБ, для каждого пользователя.
Возможные реализации:
1) Один байтовый массив на запись, индексированный вторичным ключом.
Плюсы: Быстрое чтение/запись.
Минусы: Запрос с высокой кардинальностью (до 5 результатов на запрос). Плохо для горизонтального масштабирования, если к байтовым массивам часто обращаются.
2) Все байтовые массивы в одной записи в отдельных ячейках
Плюсы: Быстрое чтение
Нейтрально: размер блока должен быть больше 250 КБ
Минусы: медленная запись (одно изменение означает перезапись всех массивов байтов).
3) Сохранение массивов байтов в LLIST LDT
Плюсы: избегайте минусы решения (1) и (2)
Минусы: LDT обычно медленные
4) Сохраняйте каждый массив байтов в отдельной записи, связанной с UUID. Сохраните список UUID в другой записи.
Плюсы: запись в каждый массив байтов не требует перезаписи всех массивов. Нет проблем с низким количеством элементов вторичных индексов. Избегает использования LDT.
Минусы: Чтение клиентом выполняется в два этапа: получение списка UUID из метазаписи, затем многократное получение для каждого UUID (очень медленно?)
5) Сохраняйте каждый массив байтов как отдельную запись, используя предопределенную схему первичного ключа (например, userid_index, например, 123_0, 123_1, 123_2, 123_3, 123_4) Плюсы: избегайте двухэтапного чтения Минусы: Теоретическая вероятность конфликта с другим пользователем (например, один и тот же хэш продукта user1_index1 и user2_index2). Я знаю, что это (очень, очень) маловероятно, но избегание по-прежнему предпочтительнее (представьте, что один пользователь может прочитать массив байтов другого пользователя из-за коллизии).
Моя оценка
Для сбалансированного чтения/записи ИЛИ ситуаций с большим количеством операций чтения/записи используйте #2 (одна запись, несколько бинов). Перезапись более затратна, но позволяет избежать других недостатков (штраф за LDT, двухэтапное чтение).
Для ситуации с высокой (пере) записью/низкой скоростью чтения используйте #3 (LDT). Это позволяет избежать перезаписи всех байтовых массивов при обновлении одного из них, поскольку записи копируются при записи.
Вопрос
Какая реализация предпочтительнее, учитывая текущую структуру данных (небольшое количество, большие объекты)? Согласны ли вы с моей оценкой (выше)?