干し石榴長文用

長文以外はTumblrへ徐々に移します。

DynamoDBでSort Keyだけ使いたい場合

やりたいこと

  • 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