2015-08-07 3 views
2

Каков наиболее эффективный способ запроса большого количества строк на основе тегов в Azure Table Storage?Запрос по тегам в Azure Table Storage

Мне нужно найти все строки, отмеченные как минимум тегами «A» и «B». Теги будут нормализованы до вставки, например. все строчные и буквенно-цифровые. Я также должен легко вытащить последние детали, поэтому мой текущий RowKey содержит перевернутый DateTime как string.Format("{0:D19}", DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks)

Все мои строки разделены на UserId

Мое текущее решение добавляет дополнительную строку для каждого тега (мышления о помещении их в отдельную таблицу), затем я могу запустить несколько запросов и присоединиться к ним на своем сервере, прежде чем возвращать их клиенту. Таким образом, при вставке лица, которые имеют две метки (A, B) будет храниться так:

[ 
    { 
     "partitionKey": "123", // UserId 
     "rowKey": "2519633682044852820" 
    }, 
    { 
     "partitionKey": "123_tags", // UserId + tags constant, this is not the actual tags - this is to put the tagged entities in a different partition 
     "rowKey": "a" // normalized tag 
    }, 
    { 
     "partitionKey": "123_tags", 
     "rowKey": "b" 
    } 
] 

запросов мне нужно, было бы что-то вроде этого:

  • top 1000 latest entities where userId = "X"
  • all entities where userId = "X" and tags contains "A" AND "B"

ответ

0

Это зависит от того, сколько данных у вас будет для одного пользователя. Ваш первый запрос прост, так как ключ раздела является идентификатором пользователя. Когда дело доходит до второго запроса, так как нет «не содержит» функциональность хранения таблицы, я бы сказал, у вас есть следующие варианты:

  • Получить все элементы для пользователя, и отфильтровать ненужные записи позже в коде (если для каждого пользователя не так много записей, это не должно быть проблемой)
  • Если для многих записей для одного пользователя вы можете записывать записи для пользователя на основе некоторого диапазона тегов, то есть ключ раздела может «UserX_TagsA-K», «UserX_TagsK-O», «UserX_TagsK-O», «UserX_TagsO-Z», а затем получить только нужный размер и отфильтровать позже код
  • Сделайте записи redundand для каждого тега, затем ключ раздела может выглядеть например «UserX_Tag123» для одной записи, и «UserX_Tag324» для одной и той же записи, но указывая, что у нее есть два тега. Если данные необходимо обновить, ключ строки может быть составным, то есть в следующем формате «GroupId: UniqueId» и с помощью предложения «StartsWith» в строке row, вы можете получить все записи для резервирования, чтобы обновить их.

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

На стороне примечания, IIRC вы можете получить последние элементы, используя поле TimeStamp по умолчанию.

+0

Данные одного пользователя могут быть до миллиона. Я думаю, вы неправильно поняли мой текущий проект pk + rk, pk не содержит тегов, а просто строку под названием «теги». Это делается таким образом, чтобы отделить тегированные объекты от «последней». Я обновил свой вопрос, чтобы отразить это. – Martin

+0

Да, я понимаю, мои предложения требуют изменений в дизайне pk + rk, с текущим невозможно выполнить запрос с предложением «Содержит», потому что он не поддерживается TS. –

+0

Кстати о TimeStamp, разве это не сортировать старые -> новые? – Martin

0

Ваш текущий дизайн выглядит хорошо для меня, и он соответствует руководящим принципам в Azure Storage Table Design Guide. Два упомянутых вами вопроса могут быть эффективно выполнены в разработанной вами таблице. У вас есть дополнительные вопросы?

Смежные вопросы