一部の親オブジェクトに送信されるアイテムのリストを保存したい。
親オブジェクトは次のようになります。
user_id - hash key
timestamp - range key
attributeA - String
attributeB - Number
listC - List of objects
listCはオブジェクト(JSONなど)のリストで、各オブジェクトにはいくつかのフィールドがあります。
attrX - number
attrY - string
attrZ - string
リストのサイズは、数要素から数百ものまでさまざまです。
どのように保存すればよいですか?
DynamoDBの制限により、このリストを親オブジェクトの属性として保持できないと思います。これらのリストを別のテーブルに移動すると思います。しかし、私は私がすべきかどうかわかりません:
アプローチ(1):
-------------------------------------
| parent_id | attrX | attrY | attrZ |
-------------------------------------
| 178 | 2 | "abc" | "xyz" |
-------------------------------------
| 178 | 2.4 | "klm" | "qwe" |
-------------------------------------
アプローチ(2):
------------------------------------------------------------------------
| parent_id | Chunk | ListC |
------------------------------------------------------------------------
| 178 | 1 | [{ X: "2", Y: "abc" }, { X: "2.4", Y: "klm" } ] |
-------------------------------------------------------------------------
| 178 | 2 | [{ X: "2.8", Y: "nop" }, { X: "3.2", Y: "qrs" } ] |
------------------------------------------------------------------------
私に何を勧めますか?
実際には、アプローチはQuery Access Pattern(QAP)に依存します。
アプローチ1:-
RDBMS設計と同様の典型的な正規化されたアプローチ。ただし、これをNoSQLの観点から考える必要があります。 DynamoDBにはno joinがあります。必要なデータを取得するには、2つのテーブルを読み取る必要がある場合があります。コストは読み取りキャパシティーユニットに基づいて計算されることに注意してください。したがって、2つの異なる読み取りにはコストがかかります。
項目サイズがDynamoDB項目サイズ400 KBを超える場合、このアプローチは受け入れられる可能性があります
クエリ式を記述して、属性attrX、attrY、attrZが通常のスカラーデータ型属性として格納されているときに、それらの属性でデータをフィルター処理できます。
アプローチ2:-
必要なすべてのデータを1つのテーブルに保持するための推奨されるNoSQLアプローチ。参加または追加の読み取りは必要ありません
アイテムのサイズが400 KBを超える可能性があるかどうかを考慮する必要があります
属性attrX、attrY、attrZでデータをフィルターするクエリを作成する必要があるかどうか。このアプローチでは、ListCデータはMap DynamoDBデータ型のリストとして保存されることに注意してください。ほとんどのシナリオでは、DynamoDBには、このような複雑なデータ構造をクエリする柔軟性がありません(つまり、リストデータ型内のマップ)。
オブジェクトのリスト-DynamoDBデータベース上のマップのリストを意味します
{X: "2.8"、Y: "nop"}-オブジェクトです。これは、DynamoDBデータベースのMAPデータタイプに変換されます。
角括弧の外側はDynamoDBのLISTデータ型に変換されます