最近Cloud Datastoreを触った際日時範囲指定の必要があるスキーマ設計について
公式ドキュメントに記載のあるベストプラクティスを試したのでご紹介したいと思います。
Datastoreの概要
まず、Cloud Datastoreの簡単な紹介ですが以下の通りです。
公式ドキュメント[Datastore の概要]
Datastore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。
インデックスの注意事項
Cloud Datastoreの特徴は色々ありますがその一つにDatastoreのデータをうまくシャーディングさせるためには連続した値を持つプロパティにインデックスを張ってはいけないという注意事項があります。
公式ドキュメント[Cloud Datastore のおすすめの方法>インデックス]
プロパティにインデックスを付ける際、単調に増加する値(NOW() タイムスタンプなど)を使用しないでください。このようなインデックスを使い続けると、ホットスポットが発生して、読み取りと書き込みを頻繁に行うアプリケーションでは Datastore モードのレイテンシに影響する可能性があります。
ベストプラクティスの実践
こちらを解消するためのベストプラクティスがドキュメントに記載されています。公式ドキュメント[ベスト プラクティス>狭いキー範囲に高頻度で読み取りと書き込みを行わない]
単調に増加するキーまたはインデックス付きプロパティがある場合、それらの先頭にランダムなハッシュを付加すると、キーが確実に複数のタブレットにシャーディングされるようになります。例えば、以下のようなデータがあるとします。
id | created_at |
1 | 2022-03-01T00:00:00z |
1 | 2022-03-01T00:00:01z |
1 | 2022-03-01T00:00:02z |
1 |
SLECT * FROM test WHERE id = 1 and created_at > DATETIME('2022-03-01T00:00:00z') AND created_at < DATETIME('2022-03-01T00:00:02z') |
公式のベストプラクティス通りidをhash化してcreated_atのタイムスタンプに付加したプロパティを追加してみます。
id | created_at | hash_timestamp |
1 | 2022-03-01T00:00:00z | c4ca4238a0b923820dcc509a6f75849b1646092800 |
1 | 2022-03-01T00:00:01z | c4ca4238a0b923820dcc509a6f75849b1646092801 |
1 | 2022-03-01T00:00:02z | c4ca4238a0b923820dcc509a6f75849b1646092802 |
1 |
SLECT * FROM test WHERE created_at > 'c4ca4238a0b923820dcc509a6f75849b1646092800' AND created_at < 'c4ca4238a0b923820dcc509a6f75849b1646092802' |
Cloud Datastoreについての所感
Cloud DatastoreはトランザクションのサポートやSQL ライクなクエリが書けるなど便利な反面 うまくスキーマ設計しないと色々な制約もあるので注意が必要だと思いました。
以上となります。ありがとうございます。