DynamoDB最速理解
DynamoDBは自由にデータをフィルタリングして値を探すことはできない。
事前に設定したキーに対応する値を取ってくるだけになる。
table, item, attribute = table, row, column
の対応
検索のためには
- プライマリキー
- セカンダリインデックス
を設定できる
上記以外の要素では検索できない。
以下の例だと PersonID
をプライマリキーに指定する。
{
"PersonID": 101,
"LastName": "Smith",
"FirstName": "Fred",
"Phone": "555-4321"
}
{
"PersonID": 102,
"LastName": "Jones",
"FirstName": "Mary",
"Address": {
"Street": "123 Main",
"City": "Anytown",
"State": "OH",
"ZIPCode": 12345
}
}
プライマリキーは2パターン存在する。
- パーティションキー(PK):
キーを内部のハッシュ関数にかけ、出力された値によって保存されるパーティション(ストレージの保存箇所)が決まる仕組み。そのためキーの重複は許されない。 - パーティションキー(PK)とソートキー(SK):
PKに加えてソートキー(SK)も含めて一意のデータを指す構造にもできる。この場合PKの重複は許され、その中でSKの重複は許されない。複数のPKをSKでソートして保存されるイメージ。PKとSKの2つを指定して検索することになる。
SKは範囲指定して検索できる。PKはできない。つまり、
- PKにAを指定し、SKにaを指定すると、1つの結果が返される
- PKにAを指定し、SKにa~cを指定すると、3つの結果が返される
- PKにAを指定し、SKに何も指定しないと、PK=Aとなるすべての結果が返される
インデックスは2種類
- グローバルセカンダリインデックス(GSI):PKとSKを持つインデックス。テーブルで持っているPK、SKとは異なってもOK。
- ローカルセカンダリインデックス(LSI):PKはテーブルと同じだが、SKは異なるキーを指定したインデックス。
LSIはPKが同じものしか指定できない、つまりは同じパーティションの中でSKを変えた検索ができるようになるということ。同じパーティションという意味で「ローカル」。
ホットパーティション(1つのパーティション、つまり1つのitemへの集中的なリクエストによる高負荷)を避けられるようなテーブル設計が求められる
インデックスによる検索はキーによる検索ではないため、一意性は保証されない。複数件ヒットする可能性が常にある。
GSIとLSIそれぞれ5つずつ定義できるため、最大で10個のインデックスを持てる。
というのが初期の設定だったが、現在はGSIが20個まで作れるようになるなど仕様が変わることもあるっぽい。そのため、AWSの公式サイトを見て最新の情報を参考にすべき。
GSIの射影可能なattribute数も制限があるらしい。ただ上限緩和申請も可能かも。
- インデックスはテーブルの一部のみ射影するため、インデックスによる検索結果はテーブルのattribute全てをもつわけではない。(GSI、LSIどちらも)
- プライマリキーによる検索はすべてのattributeを含む。
インデックスはキーではないためすべてのデータに共通で含まれているattributeでなくても指定できる。つまり、最初の方の例だと、Phone
やAddress
をGSIとして指定可能。
パーティションごとに合計10GBまでの要素サイズにしないといけない。そのためLSIは何でもかんでも作れるわけではなく、必要なものを適切に設計した上で設定しないといけない。
設計=要件に沿ったSKを指定し、必要となるattributeを絞る(射影対象を絞る)ことを検討する。
DynamoDBに対する操作
-
コントロールプレーン
DDLのようなもの。テーブルに対するCRUDの操作。
CreateTable, DescribeTable, ListTables, UpdateTable, DeleteTable -
データプレーン
DMLのようなもの。データに対するCRUDの操作。- PutItem: itemの書き込み
- GetItem: itemを1つ取り出す
- Query: プライマリキーやインデックスを指定してitemを検索し取り出す
- Scan: 指定されたテーブルもしくはインデックスのすべてのitemを取り出す
- UpdateItem: attributeを更新する
- DeleteItem: テーブルからattributeを削除する
他にも色々可能な操作はある。
公式にまとまっている。
ベストプラクティスは公式に用意されている。
- パーティションキーの決め方
- ソートキーの決め方
- 瀬カンダリインデックスの決め方
- 時系列データの処理パターン
- n対mのデータを管理するパターン
- データのQueryとScanの使い方
などなど
DynamoDBが1つのリージョンでテーブル名は1つにならないといけない。そのためテーブル名の規則は重要になる。