Open17

DynamoDB最速理解

shunshun

DynamoDBは自由にデータをフィルタリングして値を探すことはできない。
事前に設定したキーに対応する値を取ってくるだけになる。

shunshun

table, item, attribute = table, row, column
の対応

shunshun

検索のためには

  • プライマリキー
  • セカンダリインデックス

を設定できる

上記以外の要素では検索できない。

以下の例だと 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
    }
}
shunshun

プライマリキーは2パターン存在する。

  1. パーティションキー(PK):
    キーを内部のハッシュ関数にかけ、出力された値によって保存されるパーティション(ストレージの保存箇所)が決まる仕組み。そのためキーの重複は許されない。
  2. パーティションキー(PK)とソートキー(SK):
    PKに加えてソートキー(SK)も含めて一意のデータを指す構造にもできる。この場合PKの重複は許され、その中でSKの重複は許されない。複数のPKをSKでソートして保存されるイメージ。PKとSKの2つを指定して検索することになる。
shunshun

SKは範囲指定して検索できる。PKはできない。つまり、

  • PKにAを指定し、SKにaを指定すると、1つの結果が返される
  • PKにAを指定し、SKにa~cを指定すると、3つの結果が返される
  • PKにAを指定し、SKに何も指定しないと、PK=Aとなるすべての結果が返される
shunshun

インデックスは2種類

  • グローバルセカンダリインデックス(GSI):PKとSKを持つインデックス。テーブルで持っているPK、SKとは異なってもOK。
  • ローカルセカンダリインデックス(LSI):PKはテーブルと同じだが、SKは異なるキーを指定したインデックス。

LSIはPKが同じものしか指定できない、つまりは同じパーティションの中でSKを変えた検索ができるようになるということ。同じパーティションという意味で「ローカル」。

shunshun

ホットパーティション(1つのパーティション、つまり1つのitemへの集中的なリクエストによる高負荷)を避けられるようなテーブル設計が求められる

shunshun

インデックスによる検索はキーによる検索ではないため、一意性は保証されない。複数件ヒットする可能性が常にある。

shunshun

GSIとLSIそれぞれ5つずつ定義できるため、最大で10個のインデックスを持てる。
というのが初期の設定だったが、現在はGSIが20個まで作れるようになるなど仕様が変わることもあるっぽい。そのため、AWSの公式サイトを見て最新の情報を参考にすべき。
GSIの射影可能なattribute数も制限があるらしい。ただ上限緩和申請も可能かも。

shunshun
  • インデックスはテーブルの一部のみ射影するため、インデックスによる検索結果はテーブルのattribute全てをもつわけではない。(GSI、LSIどちらも)
  • プライマリキーによる検索はすべてのattributeを含む。
shunshun

インデックスはキーではないためすべてのデータに共通で含まれているattributeでなくても指定できる。つまり、最初の方の例だと、PhoneAddressをGSIとして指定可能。

shunshun

パーティションごとに合計10GBまでの要素サイズにしないといけない。そのためLSIは何でもかんでも作れるわけではなく、必要なものを適切に設計した上で設定しないといけない。

設計=要件に沿ったSKを指定し、必要となるattributeを絞る(射影対象を絞る)ことを検討する。

shunshun

DynamoDBに対する操作

  • コントロールプレーン
    DDLのようなもの。テーブルに対するCRUDの操作。
    CreateTable, DescribeTable, ListTables, UpdateTable, DeleteTable

  • データプレーン
    DMLのようなもの。データに対するCRUDの操作。

    • PutItem: itemの書き込み
    • GetItem: itemを1つ取り出す
    • Query: プライマリキーやインデックスを指定してitemを検索し取り出す
    • Scan: 指定されたテーブルもしくはインデックスのすべてのitemを取り出す
    • UpdateItem: attributeを更新する
    • DeleteItem: テーブルからattributeを削除する

他にも色々可能な操作はある。
公式にまとまっている。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.API.html

shunshun

DynamoDBが1つのリージョンでテーブル名は1つにならないといけない。そのためテーブル名の規則は重要になる。