2013-06-29 2 views
0

Я разрабатываю мобильную службу на Windows Azure с хранилищем таблиц. Я храню твистоподобные объекты для создания пользовательского фида (опять же, как и твиттер с последующим). Принимая во внимание, что я должен только запрашивать ключ раздела и ключ строки, что они должны быть для хронологического канала, который получает только твитовые объекты, которые следует за пользователем?Какой ключ от раздела и ключ строки лучше всего подходят для твитовских данных?

В качестве бонуса, как я мог бы также искать их по тегу hash (опять же зная, что я ограничен только ключом раздела и ключом строки)?

Примечание: У меня есть следующая таблица, чтобы узнать, следует ли пользователю следовать за другим.

ответ

1

Поскольку единственная индексация поддерживается на 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), чтобы последние записи всегда были сверху.

Надеюсь, это поможет.

+0

Спасибо. Я играл с датой и временем и фактически использовал структуру, которую вы предложили для следующего. Ваш метод предполагает дублирование данных, которые, я думаю, не так уж плохо, когда речь идет о дешевом хранилище NoSQL. –

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