2016-03-27 12 views
1

私は、azureを使用してメッセージングするRESTサービスを整理する必要があります。今私はDBに問題があります。私は3つのテーブルを持っている:ユーザー、チャット、チャットのメッセージ。Azureテーブルストレージのテーブルデザイン

  1. ユーザーには、ログイン、パスワードハッシュ、塩などのユーザーデータが含まれます。
  2. チャットにはパーティションキーuserlogin、rowkey - chatId、nowInChatが含まれています - ユーザーはチャットから来ました。 messageIdです、メッセージ、送信者 - - userloginのチャットの
  3. メッセージがのPartitionKeyが含まれ、WICHは userlogin_chatId_datetimeticks(zevis_8a70ff8d-c363-4eb4-8a51-f853fa113fa8 _634292263478068039)、 のrowKeyから成ります。

ユーザーが1年前に積極的にコミュニケーションを取っていて、今話していないと想像すれば、そのうちの1人は歴史を見たいと思うなど、デザインには欠点がありました。週などの時間間隔で多数の要求をサーバーに送信するには、データを要求します。今日よりも少ない時間でリクエストを送信すると効果がありません。なぜなら、私たちは全体の話を得ているからです。 テーブルのデザインをどのように変更する必要がありますか?

+0

私はデータをより標準化しなくてはならないと思います。このような問題を解決するために、NoSQLのKey-Valueデータベースで行われることがよくあります。 –

答えて

0

Azure Storage Tablesはセカンダリインデックスをサポートしておらず、ストレージは非常に安価なので、異なるパーティションや行キーを使用してデータを2回保存することをお勧めします。 Azureストレージ表デザインガイドから:

セカンダリインデックスの不足を回避するために、あなたはそれぞれに各エンティティの複数の コピーを保存することができます異なるのPartitionKeyを使用してコピーし、 のrowKeyは

https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#table-design-patterns

0

ありがとう、2つのオプションがあります。最小限の設計変更でもっとも簡単な答えは、チャットテーブルにStartTimeとEndTimeを含めることです。これらのプロパティはインデックスに登録されませんが、UserIDをフィルタリングするとスキャンする行が多くないことが予想されます。

2番目のオプションはもう少し作業が必要ですが、Partition Key = UserID、Row Key = DateTimeTicksで追加のテーブルを作成し、エンティティプロパティにChatIDが含まれるようにしてください。これにより、特定の日付/日付範囲でユーザー別に素早くフィルタリングすることができます。 (これは上記の非正規化の答えです)。

これがあなたのデザインの進歩に役立つことを願っています。

0

私は、これらのPKとRKの値を持つ別のテーブルを作成します。 パーティションキー=ユーザーID、行キー= DateTime.Max - DateTimeTicks

オプションを使用すると、また、上記の行キーの最後にChatIdを追加することができます。

このようにして、ユーザーが行った最新の通信は常に上に表示されます。だから、後でUserIdとTakeカウントだけを渡してテーブルをクエリすることができます(つまり、ユーザーからの最新のチャットエントリを取得する場合はTake Count = 1)。 Azureテーブルストレージサービスは、Rowキーの逆順ティックを使用するため、Azureテーブルストレージサービスは同じユーザーIDのエントリをRowキーの辞書順に並べ替えて、常に最新のチャットを次のように保持するため、クエリは非常に高速になります。それは最小の逆ティック値を有する。

RowKeyの最後にチャットID(つまりInvertedTicks_ChatId)を追加しても、チャットIDに関係なく、ソート順は変更されず、最新の会話が上に表示されます。

エンティティを読み込んだら、実際の日付を見つけるために、DateTime.Maxから倒立したティックを減算します。

関連する問題