しかし、それは本当に重要ですか?UIはAPIに対してネットワーク呼び出しを行う必要があることを考慮してください。それはかなり大きいです(ミリ秒単位)。データベースは、メモリ内に物事を保持し、読み取りを非常に迅速に実行するように最適化されています(たとえば、SQL ServerはすべてをRAMにロードして保持し、可能な限りすべての空きRAMを消費します)。
ロジック
理論的には、あなたは正しいです。ただし、この理論的根拠にはいくつかの欠陥があります。
あなたが述べたことから、実際にアプリをテスト/プロファイリングしたかどうかは不明です。言い換えれば、アプリからAPIへのネットワーク転送が最も遅いコンポーネントであることを実際に知っていますか?それは直感的であるため、そうであると推測するのは簡単です。ただし、パフォーマンスについて議論するときは、決して想定すべきではありません。私の雇用主では、私がパフォーマンスのリーダーです。私が最初に参加したとき、人々は、ボトルネックが何であるかについての直感に基づいて、CDN、複製などについて話し続けました。結局のところ、パフォーマンスに関する最大の問題は、パフォーマンスの低いデータベースクエリでした。
データベースはデータの取得に優れているため、データベースは必然的に最高のパフォーマンスで実行され、最適に使用されており、それを改善するためにできることは何もないと言っています。つまり、データベースは高速になるように設計されているため、心配する必要はありません。別の危険な考え方。それは、車は速く動くことを意図しているので、オイルを交換する必要はないということです。
この考え方は、一度に1つのプロセスを想定するか、別の言い方をすれば、並行性を前提とはしていません。1つの要求が別の要求のパフォーマンスに影響を与えないことを前提としています。ディスクI / O、ネットワーク帯域幅、接続プール、メモリ、CPUサイクルなどのリソースは共有されます。したがって、1つのデータベース呼び出しの共有リソースの使用を減らすことで、他のリクエストの速度低下を防ぐことができます。私が現在の雇用主に最初に参加したとき、経営者は3秒のデータベースクエリの調整は時間の無駄であると考えていました。3秒はとても短いのに、なぜ時間を無駄にしますか?CDNや圧縮などを使用した方が良いと思いませんか?しかし、インデックスを追加することで、3秒のクエリを1秒で実行できるようにすると、ブロックが2/3減り、スレッドを占有する時間が2/3減り、さらに重要なことに、ディスクから読み取られるデータが減ります。
法則
ソフトウェアのパフォーマンスは単に速度に関するものであるという一般的な概念があります。
純粋に速度の観点からすると、あなたは正しいです。システムの速度は、最も遅いコンポーネントと同じです。コードのプロファイルを作成し、インターネットが最も遅いコンポーネントであることがわかった場合、他のすべては明らかに最も遅い部分ではありません。
ただし、上記を考慮すると、リソースの競合、インデックス作成の欠如、コードの記述不足などにより、パフォーマンスに驚くべき違いがどのように発生するかを理解できると思います。
仮定
最後に一つだけ。データベースコールは、アプリからAPIへのネットワークコールと比較して安価であるべきだと述べました。しかし、アプリとAPIサーバーは同じLANにあることも言及しました。したがって、どちらもネットワークコールと同等ではありませんか?言い換えると、両方が同じ利用可能な帯域幅を持っている場合、API転送がデータベース転送よりも桁違いに遅いと仮定するのはなぜですか?もちろん、プロトコルとデータ構造は異なりますが、私はそれを得ますが、それらが桁違いに異なるという仮定に異議を唱えます。
それが濁った場所
この質問全体は、「複数」対「単一」のデータベース呼び出しに関するものです。しかし、いくつが複数であるかは不明です。上記のことから、一般的な経験則として、必要なデータベース呼び出しはできるだけ少なくすることをお勧めします。しかし、それは経験則にすぎません。
その理由は次のとおりです。
- データベースはデータの読み取りに優れています。それらはストレージエンジンです。ただし、ビジネスロジックはアプリケーション内に存在します。すべてのAPI呼び出しの結果、データベース呼び出しが1つだけになるというルールを作成すると、ビジネスロジックがデータベースで終了する可能性があります。たぶんそれは大丈夫です。多くのシステムがそうしています。しかし、そうでない人もいます。それは柔軟性についてです。
- 時々、適切な分離を実現するために、2つのデータベース呼び出しを分離したいことがあります。たとえば、すべてのHTTP要求は、ユーザーが適切なアクセス権を持っていることをDBから検証する汎用セキュリティフィルターを介してルーティングされる可能性があります。該当する場合は、そのURLに適切な機能を実行します。その関数はデータベースと対話する場合があります。
- ループでデータベースを呼び出します。これが、何が複数かを尋ねた理由です。上記の例では、2つのデータベース呼び出しがあります。2は大丈夫です。3は大丈夫です。Nはうまくありません。データベースをループで呼び出す場合、パフォーマンスは線形になりました。つまり、ループの入力にあるほど時間がかかります。APIネットワーク時間が最も遅いと断定的に言うと、データベースを10,000回呼び出す未発見のループが原因で長時間かかっているトラフィックの1%のような異常を見落とします。
- 複雑な計算のように、アプリが得意なこともあります。データベースからデータを読み取って計算を行い、その結果に基づいて、2番目のデータベース呼び出しにパラメーターを渡す必要がある場合があります(結果を書き込む場合があります)。データベースを1回だけ呼び出すためだけに、これらを単一の呼び出し(ストアドプロシージャなど)に結合すると、アプリサーバーが得意とする可能性のあるものにデータベースを使用せざるを得なくなります。
- 負荷分散:1つのデータベース(おそらく)と複数の負荷分散アプリケーションサーバーがあります。そのため、アプリがより多くの作業を行い、データベースが少ないほど、一般にデータベースの複製をセットアップするよりもアプリサーバーを追加する方が簡単であるため、スケーリングが容易になります。前の箇条書きに基づいて、SQLクエリを実行してから、複数のサーバーに分散されているアプリケーションですべての計算を実行し、終了時に結果を書き込むことは理にかなっています。これにより、スループットが向上します(全体のトランザクション時間が同じ場合でも)。
TL; DR
TLDR:すでにLAN経由でネットワーク呼び出しを行っているときに、複数のデータベース呼び出しを心配することは本当に重要ですか?もしそうなら、なぜですか?
はい。ただし、ある程度までです。実用的な場合はデータベース呼び出しの数を最小限に抑えるようにしますが、それらを結合するためだけに互いに関係のない呼び出しを結合しないでください。また、ループ内でデータベースを呼び出すことは避けてください。