2012-05-05 4 views
0

Я пытаюсь создать систему управления конфигурациями/настройками, которую я собираюсь хранить в хранилище значений ключей.иерархическое хранилище ключей с несколькими частями

У меня есть ключ с несколькими частями - OrganizationId + TenantId + UserId + ApplicationId, тогда как значение представляет собой сериализованный объект конфигурации/настроек. Множественные части ключа являются иерархическими - то есть userid принадлежит к tenantid, принадлежащему организации id

Требования к бизнесу таковы, что я должен вернуть объект конфигурации/настроек пользовательского идентификатора (user id), если он существует или вернуть уровень арендатора (идентификатор арендатора) или вернуть объект уровня организации (org id). Объект уровня организации всегда будет существовать.

Планирует хранить объект уровня орга с ключом, как - (OrgId - а, TenantId - 0, UserId - 0, AppId - 0) Аналогично, арендатор объект уровня будет храниться в виде - (OrgId - а, TenantId - b, UserId - 0, AppId - 0) и т. д.

Когда я получаю запрос на возврат определенного объекта конфигурации/настройки, я получаю: OrgId (a), TenantId (b), UserId (c) и AppId (d) в качестве входных данных. Моя работа запрос магазина ключ-значение, чтобы вернуть объект на соответствующем уровне

я могу добиться этого, сделав 4 звонков в худшем случае в хранилище ключей значения -

  1. а, Ь, с, д
  2. а, б, в, 0
  3. а, б, 0, 0
  4. а, 0, 0, 0

есть ли способ, в котором можно достичь этого в одном вызов ? Любые дополнительные структуры данных, которые я могу поддерживать для достижения этого? Любые алгоритмы, которые я могу использовать для решения этой проблемы?

Спасибо заранее!

ответ

1

Вот ваши два примера настройки

(a,0,0,0) => 1 
(a,b,0,0) => 2 

Теперь предположим, что я иду через все возможные комбинации в лексикографическом порядке и посмотреть, что я получаю

(a,0,0,0) => 1 
(a,0,0,a) => 1 
.... 
(a,b,0,0) => 2 
(a,b,0,a) => 2 
... 
(a,c,0,0) => 1 

и хранить только те точки, в которых все меняется

(a,0,0,0) => 1 
(a,b,0,0) => 2 
(a,c,0,0) => 1 

Я не расширил исходные данные более чем на два раза o, и я могу выработать настройку для любой позиции, используя один запрос, который возвращает наибольшую позицию < = позиция запроса.