質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

588閲覧

データベースの不要なリクエストを節約したい。

yuki_90453

総合スコア326

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2020/04/28 02:45

#概要
商品一覧を表示するサイトを開発しております。
ページを表示するたびにデータベースから、1度に1000件以上の商品データを取得しております。
データベースはDynamoDBを使用しており、従量課金なので、ロード回数やデータ量を節約したいと考えております。

#仕様
商品一覧ページで表示されるのは新着順の上位30件だけです。
データの取得、ソート、加工を全てフロントエンド(React)で行っております。

#質問
1)
データベースのリソース節約の為のアイデアを教えて頂けないでしょうか、ざっくりで大丈夫ですのでアイデアを頂ければ幸いです。

データベースの不要なロードを抑える為に、Redisにデータをキャッシュさせる方法は良い方法と言えるのでしょうか。

商品一覧ページで表示されるのは新着順の上位30件だけですので、ページを進めた場合や、ソートを行ったときに動的に残りのデータを読み込めれば、不要なロードは防げるのではないかと思います。
この場合、フロントエンドだけでは対処は難しいでしょうか?
やはりデータを出力しているバックエンド(Lambda)で対処すべきでしょうか?

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kenji.Noguchi

2020/04/28 03:19

find().limit(30)とかskip()とか?RedisはAWSのElastiCache?ブラウザ側のローカルストーレジを使う方法もあるのでは?
guest

回答1

0

ベストアンサー

ページを表示するたびにデータベースから、1度に1000件以上の商品データを取得しております。

この記述を見ていると、おそらく裏でフルスキャンをしているのではないか、、、?と思いました。以下、そのつもりで私が思ったことを回答します(前提が違ってたらすみません)。

基本的なスタンスとしては、バックエンドの設計問題として対処する問題なのかなという印象を持っています。テーブル設計がクエリ要件に適合していない構造であるようにお見受けいたしました。そのため、キャッシュは根本的な問題の是正にはなりえないのではないかと思います。


DynamoDB のインデックスは一度構築した後では基本的にほぼ変更不可なので、今のスキーマを維持しながら改善するのであれば、クエリ要件に適したGSIを付け足すか(可能ならば)、あるいはCQRSパターンを使ってクエリ要件に適した構造の別テーブルを定義するかだと思います。

CQRSの内容については検索してお調べいただければと思いますが、 DynamoDB であれは例えば DynamoDB Streams を使って新規構築したクエリ用の別テーブルに再編成したアイテムを格納するとかのアプローチを採ることになります。

※CQRSを採用する場合、最新データのリアルタイムな反映はできず結果整合なクエリになってしまいますが、商品検索のユースケースなら必ずしもシビアなリアルタイム性が要求されるわけじゃないと思ってます。なので、最新データの反映に多少の遅延を許容できるならCQRSは検討余地があります。

具体的にどう、という話は今のデータ構造やクエリ要件次第なので指摘が難しいですが、GSIなどでインデックスに指定したキー属性を用いてクエリできる構造になっていればLimitが適切に効くので、クエリ要件に適合したインデックスを持たせるようにGSIを構成する、もしくはそれ用のテーブルを作るなどするのが良いかと思います。

※課金を気にしての質問であれば、もしかすると却って高つくかもしれません(さすがにフルスキャン多用の状況と比較するなら、お釣りが来るくらいには改善するだろうと思いますが...)。

投稿2020/07/16 13:25

hassaku_63

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問