これは思考を整理するためのメモ書きであり、ナレッジではありません。
検索の種類
- キーによる一本釣り
- 複合キーによる一本釣り
- キー以外のフィールドに対する完全一致判定
- 部分一致判定
- 大小判定
- AND演算 による絞り込み
- OR演算 による結合
- NOT演算 による反転
DynamoDB で実現可能か
キーによる一本釣り
Hash Key にキーを格納することで可能
複合キーによる一本釣り
Hash Key に複数のフィールドの値を結合した文字列を格納することで可能
キー以外のフィールドに対する完全一致判定
グローバルセカンダリーインデックスを作成すれば可能。
ただし、値が十分に分散する必要がある。(例えば、動画の視聴回数のような、値に偏りがある場合はだめ)
部分一致判定
Range Key に対する Begins with だけが可能。
大小判定
Range Key に対してのみ可能。
AND 演算 による絞り込み
Hash Key と Range Key でのみ可能
OR 演算 による結合
一切できない
NOT 演算 による反転
一切できない
DynamoDB が苦手なクエリ
- キー以外のフィールドに対する完全一致判定
- Hash Key に対する部分一致判定
- Hash Key に対する大小判定
- Hash Key と Range Key 以外の組み合わせの AND演算
- OR 演算
- NOT 演算
自分が欲しいクエリ
- キー以外のフィールドに対する完全一致判定
- Hash Key に対する部分一致判定
- Hash Key に対する大小判定
- Hash Key と Range Key 以外の組み合わせの AND演算
なぜ難しいか
キー以外のフィールドに対する完全一致判定
値が分散していないとシャードが偏る
どうすればいい?
値が分散しない=値のバリエーションが少ないなので、事前に結果を作ってしまう
Hash Key に対する部分一致判定
データがどのシャードにあるかを特定できなくなる
どうすればいい?
高速な全文検索の仕組みがあればよさそう
Hash Key に対する大小判定
データがどのシャードにあるかを特定できなくなる
どうすればいい?
高速な全文検索の仕組みがあればよさそう
Hash Key と Range Key 以外の組み合わせの AND演算
インデックスを作るのが難しい
どうすればいい?
クエリを工夫(基本完全一致、最後だけあいまいな条件を付けられる)すれば高速な全文検索の仕組みがあればよさそう。
DynamoDB に足りないもの
- 十分に値が分散しないケースでのインデックス作成
- 全文検索