Вероятно, вы получите оптимальное решение только путем стресс-тестирования реальных сценариев в вашей среде, но вот несколько советов. Во-первых, если скорость записи является узким местом, может иметь смысл записать измененное состояние в хранилище только для добавления, отдельно от неизменяемых данных, а затем снова присоединить данные для запросов. Запись только при добавлении (например, как файлы журналов) будет быстрее, чем обновление существующих записей, в первую очередь потому, что минимизирует поиск дисков. Эта стратегия также может помочь с проблемой изменения данных во время запросов. Вы можете запросить «снимок» во времени. Например, HBase хранит несколько обновлений с метками времени в записи. (Номер настраивается.)
Это особый случай персистентной стратегии, называемой Multiversion Concurrency Control - MVCC. Исходя из вашего описания, MVCC, вероятно, является наиболее важной базовой стратегией для вас для выполнения запросов на определенный момент времени и получения согласованной информации о состоянии, даже когда обновления происходят одновременно.
Конечно, выполнение таких объединений по разделенным данным приведет к снижению производительности запросов. Поэтому, если производительность запросов важнее, подумайте о записи целых записей, в которых неизменяемые данные повторяются вместе с изменяющимся состоянием. Это займет больше места, как компромисс.