web-dev-qa-db-ja.com

ブールキーに対するDynamoDBクエリ

私はDynamoDB(および一般的にはnoSQL)を初めて使用し、いくつかの概念を理解するのに少し苦労しています。特に1つは、ブールキーに基づいてテーブルをクエリすることに関する問題がいくつかあります。

ブールキーにプライマリインデックスまたはセカンダリインデックスを作成できないことはわかっていますが、次の構造のテーブルに理想的にインデックスを付けてクエリを実行する方法がわかりません。

reportId: string (uuid)
reportText: string
isActive: boolean
category: string

次の検索を完了できるようにしたいと思います。

  1. 特定のレポートに直接アクセスします(reportIdのプライマリハッシュインデックス)
  2. 特定のカテゴリのレポートを一覧表示します(カテゴリのプライマリハッシュインデックス)

これらはどちらも簡単ですが、他に2つのクエリを実行したいと思います。

  1. IsActive = trueとしてマークされているすべてのレポートを一覧表示します
  2. IsActive = trueとしてマークされている特定のカテゴリのすべてのレポートを一覧表示します

私の最初のアプローチは、isActiveにプライマリハッシュキーインデックスを作成し、categoryに範囲キーを作成することですが、キータイプとして選択できるのはStringNumberBooleanのみです。

isActiveを文字列(ブール値のtrueではなく 'true'として保存)として保存すると問題は解決しますが、ブール値のプロパティに文字列を使用するとひどいことになります。

私は何かが足りないのですか?ブール値でテーブルを直接クエリする簡単な方法はありますか?

どんなアドバイスでも大歓迎です。

前もって感謝します。

22
fruvos

私のプロジェクトにはこの特定のシナリオが含まれており、ローカルとグローバルの両方のセカンダリインデックスで スパースインデックス を使用する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を使用します。レポートがアクティブでない場合、属性は完全に。意味がありますか?

33
readyornot