3

大量の GPS データをストレージ テーブルに保存しています。各パーティションは、最大 100 万のエンティティに到達できます。テーブルに挿入される各 GPS エンティティは、実際には前に挿入されたデータと連続しているため、順序が重要です。

時々、次のクエリを実行する必要があります。

現在のエンティティ (同じパーティション内) から前/次の 3 つの GPS エンティティを取得します。

RowKey 設計のオプション:

  1. 増分整数を作成します。 しかし、テーブルの現在のサイズを追跡するにはどうすればよいでしょうか? テーブルの行数を取得したり、最後に挿入された行を取得したりする方法はありません。

  2. DateTime ティックを使用します。 しかし、ティックを使用して前/次のエンティティを取得するにはどうすればよいでしょうか?

C# で SDK バージョン 2.0 を使用しています。

4

1 に答える 1

7

これは非常にクールな問題です。

指定されたエントリの前後にあるエントリのみを検索する場合は、DateTime.Now.Ticks または (DateTime.Max.Ticks - DateTime.Now.Ticks) をRowKey を取得し、クエリで「Take」コマンドを使用して、最も近い X レコードを見つけます。

ただし、特定の場所の ID の後または前にある最も近い場所を見つける必要があるため、RowKeys に適していると思われる設計パターンの 1 つを次に示します。

  • GPS 位置ごとに 2 つのエンティティを保存する必要があります。行キーが異なることを除いて、エンティティのデータは同じである必要があります
  • 1 つのエンティティの RowKey は DateTime.UtcNow.Ticks で、プレフィックスは "A" (昇順) です。
  • もう一方のエンティティには、DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks の RowKey があり、"D" (降順) などのプレフィックス文字があります。

たとえば、7 つの場所、Location1..thru..Location7 があるとします。ここでは、01 から 99 までのランダムな Tick 値を指定しました (簡単にするため)。MaxTicks が 100 であるとします。これにより、テーブルに次のデータが含まれるようになります。

Rowkey、エンティティ データ

  • A----01、ロケーション 1
  • A----50、ロケーション 2
  • A----55、ロケーション 3
  • A----66、ロケーション 4
  • A----67、ロケーション 5
  • A----90、場所6
  • A----99、ロケーション 7
  • D----01、ロケーション 7
  • D----10、場所6
  • D----33、場所5
  • D----34、ロケーション 4
  • D----45、ロケーション 3
  • D----50、ロケーション 2
  • D----99、ロケーション 1

これで、すべてのエンティティについて、その「反対の」Rowkey エンティティを簡単に計算できます。(RowKey を DateTime.MaxValue.Ticks から減算し、プレフィックスを A から D または D から A に反転するだけです)

したがって、Location3 の前にある 2 つのエンティティが必要な場合は、RowKey が "D----45" より大きく、"D----99" (最大) より小さいテーブルから 2 つのエンティティを取得するクエリを発行するだけです。 . また、Location3 の後に 2 行を取得する必要がある場合は、RowKey が "A-----55" より大きく、"A-----99" (最大) 未満である Take 2 を発行するだけです。「より小さい」基準を発行することは重要です。これにより、「A」に対してクエリを実行しているときに誤って「D」に出くわすことはありません。

バッチ トランザクション内のエンティティの両方のセットを更新/挿入して、両方またはいずれもテーブルに挿入されないようにして、「できあがり」を保証します。

このアプローチの欠点は、ストレージの 2 倍の料金を支払う必要があることです。

これが役に立ち、あまり混乱しないことを願っています

于 2013-03-04T07:29:10.433 に答える