やりたいこと
- DynamoDBのテーブル全体に対して、ある日付以降のレコードを"クエリ"したい
- データ量に対して"スキャン"の負荷が比例していくのは明白に避けたいので…
- Sort KeyだけのGSIて作れないのだろうか
注意・免責
以下に書くことは世の中のすべての要件に対応できるものではありません。
どちらかというと随筆になってしまった。
背景
現在携わっているシステムで、今思うと見切り発車でしたがDBはすべてDynamoDBです。
掲題と関係ないですが当然RDBにおけるJOINしたいような要件もあったのでめっちゃ大変でした(それはそれで別記事を起こすべきか)。
参考
めっちゃ参考になりました。
www.ketancho.net
hack-le.com
苦し紛れの策
やっぱり「ダミー列」に同一の値を持たせてPartition Keyにするしかないですが、要件的に「ダミー列」の値を期間で分けることが可能なのであれば、多少はベターになるのではないかというのが趣旨です。
例えばゲーム等のアプリで以下の状況だったとして(日付などは適当です)、
- 2019年3〜6月にOBT実施
- 2019年9月〜サービス開始
RailsでDynamoidを使っている場合は、以下のようなmoduleを定義すれば適宜必要なモデルにincludeできます。
新しい期間が始まるときのデプロイ前に`current`の値を更新しておきます。
インデックスのパーティションが期間ごとに分かれるので、単一パーティションよりは内部的に多少マシになるのでは…
module ServicePeriod extend ActiveSupport::Concern OBT = 'obt' SERVICE_IN = 'service_in' def self.current SERVICE_IN end included do field :service_period, { default: ServicePeriod.current } validates :service_period, inclusion: { in: [OBT, SERVICE_IN] } global_secondary_index( hash_key: :service_period, range_key: :created_at, projected_attributes: :all, ) end end