PartitionKey/Row ではインデックス作成のみがサポートされているため、the basic idea is to denormalize the data based on how you're going to search on that data
. つまり、複数のテーブルに同じデータを格納することになります。あなたが達成しようとしているものには、多くのデザインが考えられます。私が考えることができるものを概説しています:)。
テーブル ストレージを使用して、Windows Azure でモバイル サービスを設計しています。ユーザー フィードを生成するためにつぶやきのようなオブジェクトを格納しています (これも、次のような twitter のように)。パーティション キーと行キーのみをクエリする必要があることを考慮すると、ユーザーがフォローしているつぶやきのようなオブジェクトのみを取得する時系列フィードでは、それらは何にすべきでしょうか?
システム内の各ユーザーが固有のユーザー ID として GUID を取得するとします。あなたがやろうとしていることを達成するために、多くのアプローチがあるかもしれません。すべてのアプローチで、ユーザーがフォローしているユーザーのリストを保持するテーブルが必要になります。このテーブルを としましょうPeopleIFollow
。このテーブルには次のものが含まれます。
PartitionKey = ユーザーの ID
RowKey = フォローしているユーザーの ID
次に、ユーザー フィードの取得について説明します。
すべてのフィードの集中テーブルを用意する:
これを実現するには、すべてのフィードを格納するテーブルが必要です。と呼びましょうFeeds
。ユーザーの最新のフィードを取得することにのみ関心があるため、このテーブルでは次のようになります。
PartitionKey = UTC ティックでのフィードの日付/時刻、最大で秒の精度 (要件に基づいて精度を決定できます)
RowKey = 投稿したユーザーの ID。
次に、最初PeopleIFollow
にユーザーのリストにアクセスして取得し、次にこのテーブルにアクセスして、最後のx
数秒間のユーザーからのフィードを取得します。
ユーザーごとにフィード テーブルを用意します。
このアプローチでは、各ユーザー フィードが個別のテーブルに入れられます。このテーブルに という名前を付けましょうFeeds<UserId>
。この表では、
PartitionKey = UTC ティックでのフィードの日付/時刻、最大で秒の精度 (要件に基づいて精度を決定できます)
RowKey = フィードの一意の識別子。
まず、このテーブルを調べて、ユーザーがフォローしているユーザーのリストを見つけます。次に、各ユーザーについて、個々のフィード テーブルを調べて、最後のx
数秒間のデータをフェッチします。
おまけとして、これらをハッシュ タグで検索するにはどうすればよいでしょうか (パーティション キーと行キーに限定されていることがわかります)。
ここでも、ハッシュ タグを投稿に関連付けるテーブルが必要です。したがって、各投稿がPosts
PartitionKey = 投稿を識別する ID で呼び出されるテーブルに保存されていると仮定すると、次のように呼び出されるテーブルを持つことができますHashTags
。
PartitionKey = ハッシュタグ
RowKey = 投稿の ID
このシナリオでは、最初にテーブルからすべての投稿 ID を見つけてから、HashTags
テーブルにディップしPosts
てその投稿に関する詳細を取得します。
明らかに、これらすべてのアプローチでは、複数のテーブル/パーティションにまたがってデータを保存する方法 (したがって、トランザクションは対象外です) などについて考える必要があります。日付/時刻の値を格納する場合、最新のエントリが常に一番上に表示されるように、データを逆の時間順に格納することを検討してください (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks を使用)。
お役に立てれば。