2016-11-11 2 views
0

テーブルストレージを使用しているアプリケーションで監査証跡を実装することを検討しています。テーブルストレージを使用した監査証跡の設計

特定の顧客のすべての操作と、その顧客のエンティティのすべての操作を記録できる必要があります。

私の最初の推測では、各顧客(Audits_CustomerXXX)のテーブルを作成し、エンティティIDと行キーのパーティションキーとして(DateTime.Max.Ticks - DateTime.Now.Ticks).ToString( "D19")値。これは私の質問が特定のエンティティに起こったときにうまくいくのですか?たとえば、購入の監査ではPartitionKey = "Purchases/12345"、RowKeyにはタイムスタンプが入ります。

しかし、顧客全体からの鳥瞰図が必要な場合は、パーティション間で行キーによる並べ替えをクエリできますか?または、異なるパーティションキーでデータを保持するセカンダリテーブルを作成する方がよいでしょうか?また、(DateTime.Max.Ticks - DateTime.Now.Ticks).ToString( "D19")を使用すると、同じパーティション内の2つのアクションが同じティックで起きたときにエラーを防ぐ方法があります。 )。

おかげ

+0

エンティティIDの意味を説明できますか? –

+0

ええ、それは "pictures/1234"や "purchase/5221"のような文字列IDです –

+0

もう1つ質問:鳥瞰図に関しては、特定の日付/時間範囲の間のすべてのアクションを見たいと思うでしょう。あれは正しいですか? –

答えて

1

あなたは確かに鳥の目のビューのために別のテーブルを作成することもできますが、あなたが本当にする必要はありません。 Azureテーブルがスキーマレスであることを考慮すると、このデータを同じテーブルに保持することもできます。 PartitionKeyを逆ティックとして、エンティティIDとしてRowKeyを保持します。 PartitionKeyのみでクエリを実行するので、RowKeyもGUIDとして保持することができます。これにより、すべてのエンティティが一意であることが保証されます。または、あなたのエンティティIDにGUIDを追加して、それをRowKeyとして使用することもできます。

ただし、PartitionKey値が異なる2つのエンティティを挿入しているため、各エントリがTableサービスへの別の要求になる可能性があるため、ネットワーク障害に対してコードを保護する必要があります。アプリケーションでこれを処理する方法は、このペイロードをキューメッセージに書き込んだ後、そのメッセージをバックグラウンドプロセスで処理することです。

関連する問題