ユーザーの「カタログ」を表示する REST API があります。カタログは、全体的なカタログ メタデータ (残りの金額など) を伴う製品のリストです。
このメタデータをカタログ応答に追加しようとしている段階ですが、データベースの設計に行き詰まりました。バッキング ストアは Amazon の DynamoDB であり、これは単なるキー値ストアです。特に、主キー (「ハッシュ」) や副キー (「範囲」) などをサポートしています。
現在、データベース エントリは次のようになっています。
{ customerId: "xxx", productId: "yyyy", productPrice: "zzz" }
これらを多かれ少なかれ直接カタログ エントリに変換できます。
{ products: [{ id: "yyyy", price: "zzz" }] }
しかし、次のようなメタデータを含む応答が必要です
{ metadata: { moneyLeft: 5 }, products: [{ id: "yyyy", price: "zzz" }] }
問題は、データベースにメタデータをどのように保存するかです。
アプローチ #1: データベースを分離する
すべてのメタデータ プロパティのプライマリ キーcustomerId
と列を使用して、個別のメタデータ テーブルを作成します。次に、両方のテーブル (DynamoDB への 2 つの HTTP リクエスト) に対してクエリを実行し、結果をまとめます。
アプローチ #2: クエリ指向
現在のテーブルを再利用して、このカタログ表示クエリ用に特別に設計します。次のような2種類の行があります
{ customerId: "xxx", productId: "yyyy", productPrice: "zzz", type: "product" }
{ customerId: "xxx", moneyLeft: 5, type: "metadata" }
(ただし、もう少し堅牢です)。次に、 を使用してテーブルからすべての行を選択するクエリを実行しcustomerId = xxx
、サーバー コードでプロパティをオンにして目的の応答に変換しtype
ます。
アプローチ 1 はまだリレーショナル DB の考え方にとらわれているようで、2 つの DB 呼び出し (= HTTP 要求) が必要になるため、私はアプローチ 2 に傾いています。しかし、それはとても奇妙で、それが良い考えかどうかはわかりません。たぶん、3番目のアプローチがありますか?本当の答えは「ドキュメント データベースを使用する必要がある」ということだと思いますが、この時点で、私たちは DynamoDB にかなりコミットしています ---。