私はDynamoDB(および一般的にはnoSQL)を初めて使用し、いくつかの概念を理解するのに少し苦労しています。特に1つは、ブールキーに基づいてテーブルをクエリすることに関する問題がいくつかあります。
ブールキーにプライマリインデックスまたはセカンダリインデックスを作成できないことはわかっていますが、次の構造のテーブルに理想的にインデックスを付けてクエリを実行する方法がわかりません。
reportId: string (uuid)
reportText: string
isActive: boolean
category: string
次の検索を完了できるようにしたいと思います。
reportId
のプライマリハッシュインデックス)これらはどちらも簡単ですが、他に2つのクエリを実行したいと思います。
私の最初のアプローチは、isActive
にプライマリハッシュキーインデックスを作成し、category
に範囲キーを作成することですが、キータイプとして選択できるのはString
のNumber
、Boolean
のみです。
isActive
を文字列(ブール値のtrueではなく 'true'として保存)として保存すると問題は解決しますが、ブール値のプロパティに文字列を使用するとひどいことになります。
私は何かが足りないのですか?ブール値でテーブルを直接クエリする簡単な方法はありますか?
どんなアドバイスでも大歓迎です。
前もって感謝します。
私のプロジェクトにはこの特定のシナリオが含まれており、ローカルとグローバルの両方のセカンダリインデックスで スパースインデックス を使用するDynamoDBのベストプラクティスに従いました。これがあなたの例で私がすることです:
Table: reportId (string, hash key) || reportText (string) || isActive (string, marked as "x") || category (string)
ActiveReportsIndex (Local Secondary Index): reportID (hash key) || isActive (range key)
ActiveReportsByCategoryIndex (Global Secondary Index): category (hash key) || isActive (range key) || reportId
スパースインデックスの背後にある考え方は、isActive: "x"としてマークされたレポートのみがインデックスに表示されるため、メインテーブルよりも必要なストレージと処理が少なくて済むということです。 isActive属性をブール型にする代わりに、常にtrue
またはfalse
値を格納します。レポートがアクティブな場合は、「x」などの文字列を使用してDELETEを使用します。レポートがアクティブでない場合、属性は完全に。意味がありますか?