Как смоделировать карту<номер, карта <номер, номер >> в Беркли DB
Я думаю об использовании Berkeley DB
как часть бэкэнда для высококонкурентного мобильного приложения. Для моего приложения, используя Queue
для их рекордной блокировки уровней было бы идеально. Однако, как указано в заголовке, мне нужно запрашивать и обновлять данные, которые будут концептуально моделироваться как Map<Number,Map<Number,Number>>
,
Внешний ключ будет ссылаться на уникальный Item
и внутренний ключ будет ссылаться на один из этого Item
метрики. Внутренним значением будет счетчик, который мне нужно атомарно увеличивать, возможно, очень часто. Следовательно, почему блокировка уровня записи является желательной особенностью здесь. В идеале уровень записи был бы аналогичен Item
уровень в модели данных.
Данные будут использоваться следующими двумя способами:
добавлять
<Number,Map<Number,Number>>
запись- Относительно редко
Пакетные приращения ~15 метрик атомарно, в базе данных, учитывая
Item
идентификатор и список метрических идентификаторовТогда получите это
Item
метрическая карта- Очень часто
Внутренний Map
должен иметь возможность расти, но он не получит больше 200 записей.
И это все.
Ты думаешь Berkeley DB
подойдет для такого применения?
Обновить:
По-видимому, схема моих данных не достаточно ясна, поэтому я собираюсь разбить ее дальше.
Item
имеет много метрик, каждый из которых имеет один счетчик, то есть один к (много к одному), т.е. <Number,Map<Number,Number>>
Но у меня много Item
, так что мне нужно это Map<Number,Map<Number,Number>>
1 ответ
Я думаю, что Berkeley DB был бы хорошим выбором, с некоторыми оговорками о том, как вы решите выложить свои данные. Но, возможно, вы захотите рассмотреть и другие хранилища значений ключей - например, LMDB должен оказаться намного проще в использовании, чем BDB.
На первый взгляд кажется, что запись ("значение" в "ключ / значение") в вашей системе может быть вашей внутренней Map<Number, Number>
, queue
метод доступа (или btree
, FWIW) обеспечивает внешний Map<Number, Record>
,
Berkeley DB не предоставляет много (на самом деле) помощи для доступа к материалам внутри записи. Таким образом, вам все равно придется представлять свою внутреннюю Карту таким образом, чтобы обеспечить произвольный доступ и модификацию ее содержимого. В зависимости от того, насколько велик первый номер в Map<Number, Number>
Вы могли бы сделать простой массив в стиле C. Вы можете использовать объект JSON, или protobuf, или что-нибудь еще, о чем вы можете подумать.
Этот макет имеет смысл, только если у вас есть много, много записей во внешней карте>, по сравнению с 200 или около того записями, которые вы упомянули для размера внутренней карты. Блокировка уровня записи применяется ко всей внутренней карте, потому что это ваша запись.
Другой метод заключается в создании составного ключа из первых двух Number
в вашей схеме. То есть, Map<NumberX, Map<NumberY, NumberZ>
становится базой данных с ключом NumberX_NumberY
и значение NumberZ
, Это даст вам быстрый произвольный доступ к любой конкретной записи на вашей внутренней карте, но вам придется использовать курсор для извлечения всех записей на всей внутренней карте.