Поскольку единственная индексация поддерживается на PartitionKey/Row, the basic idea is to denormalize the data based on how you're going to search on that data
. Что бы это значило, так это то, что вы в конечном итоге сохраните одни и те же данные в нескольких таблицах. Возможно, существует много вариантов для того, что вы пытаетесь выполнить. Я излагаю то, о чем я мог подумать :).
Я проектирую мобильную службу на Windows Azure с хранилищем таблиц. I Сохранение твистоподобных объектов для создания пользовательского фида (опять же, как твиттер с последующим). Принимая во внимание, что я должен только запрашивать ключ раздела и ключ строки, каково это должно быть для хронологического фида , который получает только те твитоподобные объекты, которые следует за пользователем?
Предположим, что каждый пользователь в вашей системе получает идентификатор GUID как уникальный идентификатор пользователя. Теперь, чтобы выполнить то, что вы пытаетесь сделать, может быть много подходов. Во всех подходах вам понадобится таблица, в которой содержится список пользователей, которых следует пользователю. Назовем эту таблицу PeopleIFollow
. Эта таблица будет иметь:
PartitionKey = Id пользователя
RowKey = Id пользователя следовать
Сейчас подходит к тому, чтобы пользователь каналы:
иметь централизованную таблицу для всех каналов:
Для этого вам понадобится таблица, в которой будут храниться все каналы. Назовем это Feeds
. Поскольку вы заинтересованы только в получении последней ленты для пользователя, в этой таблице:
PartitionKey = дата подачи/время в UTC тиков до секунды точности (вы можете принять решение о точности в зависимости от ваших требований)
RowKey = Id пользователя, который опубликовал.
Затем вы сначала погрузитесь в PeopleIFollow
и получите список пользователей, а затем опустите в эту таблицу, чтобы получать фиды от пользователей за последние x
секунд.
Есть стол подачи для каждого пользователя:
В таком подходе каждый канал пользователя переходит в отдельную таблицу. Назовите эту таблицу как Feeds<UserId>
.В этой таблице
PartitionKey = дата подачи/время в UTC тиков до секунды точности (вы можете принять решение о точности в зависимости от ваших требований)
RowKey = уникальный идентификатор для корма.
Сначала вы окунетесь в эту таблицу и узнаете список пользователей, которых следует пользователю, а затем для каждого пользователя, которого вы окунели в таблицу отдельных каналов, и получите данные за последние x
секунд.
В качестве бонуса, как я мог также искать их по хэш-тегу (снова зная , что я ограничен только разделить ключ и грести ключ)?
Снова вам нужно будет иметь стол, в котором вы бы связали хеш-теги с сообщениями. Таким образом, если мы предположим, что каждая запись сохраняется в таблице называется Posts
с PartitionKey = некоторые идентифицирующего пост, вы могли бы иметь таблицу с именем HashTags
с:
PartitionKey = хэш-тег
RowKey = Идентификатор post
В этом случае сначала вы найдете все сообщения из таблицы HashTags
, а затем опустите в таблицу Posts
, чтобы получить информацию об этом сообщении.
Очевидно, что при всех этих подходах вам нужно будет подумать о том, как вы собираетесь сохранять данные по нескольким таблицам/разделам (таким образом, транзакции не представлены) и т. Д. Для хранения значений даты и времени вы можете захотеть сохранить данные в обратном хронологическом порядке (используя DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks), чтобы последние записи всегда были сверху.
Надеюсь, это поможет.
Спасибо. Я играл с датой и временем и фактически использовал структуру, которую вы предложили для следующего. Ваш метод предполагает дублирование данных, которые, я думаю, не так уж плохо, когда речь идет о дешевом хранилище NoSQL. –