開発者がデータベースへの直接接続の代わりにWebサービスを使用する必要があるのはなぜですか?[閉まっている]


93

データベースに直接接続するのではなく、Webサービスを介してリモートデータベースに接続する必要がある理由の「トップ10」リストを探しています。これは現在内部での議論であり、私はプロWebサービスですが、議論を失っています。私はWCF / Webサービスの基本を理解していますが、他の誰も理解していません。前進したいことは何でもできますが、現在選択していることに固執する必要があります。

これが私が思いついたものです。もう?

  1. WCF Webサービスは、正しく構成されていれば、より安全になります。
  2. DBへの変更は、サービスレベル(構成ファイルまたは再コンパイルサービス)でのみ行う必要があります。
  3. セットアップしてホストすると、Webサービスを利用しやすくなります。

回答:


120
  1. セキュリティ。Webサーバー/アプリユーザー以外にDBアクセスを許可していません。

    これは、大量のユーザーがいる場合に特に重要です。DB側でのユーザー/ロールメンテナンスの痛みを回避できます。

  2. DB負荷の軽減。Webサービスは、DBから取得したデータをキャッシュできます。

  3. データベース接続プール(hat / tip @Dogs)。

    Webサービスは、永続的に開かれたDB接続の小さなプールを使用できます。はさまざまな方法で役立ちます。

    • データベース接続プールは、データベースサーバー側で制限されています。

    • 新しいDB接続を開くと、(特にデータベースサーバーにとって)非常にコストがかかります。

  4. フォールトトレランス機能-サービスは、サービスの利用者がフェイルオーバーの詳細を実装しなくても、プライマリ/ DRデータソースを切り替えることができます。

  5. スケーラビリティ-サービスは、サービスコンシューマがリソース選択の詳細を実装しなくても、複数の並列データソース間でリクエストを分散できます。

  6. カプセル化。サービスユーザーに影響を与えることなく、基盤となるDB実装を変更できます。

  7. データ強化(これには、クライアントのカスタマイズからローカリゼーションから内部化までが含まれます)。基本的にこれらはどれも便利かもしれませんが、どれもデータベースへの大きな負荷であり、DB内に実装するのが非常に難しいことがよくあります。

  8. あなたに当てはまる場合と当てはまらない場合があります-特定のアーキテクチャの決定は、DBアクセスに適していません。たとえば、Unixで実行されているJavaサーバーはデータベースに簡単にアクセスできますが、Windows PCで実行されているJavaクライアントはデータベースに対応していないため、データベースにしたくありません。

  9. 移植性。すべてのクライアントが同じプラットフォーム/アーキテクチャ/言語を使用しているとは限りません。それらのそれぞれで適切なデータアクセスレイヤーを再作成することは、Webサービスのコンシューマーレイヤーを構築するよりも(前述のフェイルオーバーなどの問題を考慮に入れる必要があるため)困難です。

  10. 性能調整。クライアントが独自のクエリを実行している(事前に用意されたストアドプロシージャではない)場合は、100%確実に、最適でないクエリを使用するようになります。また、Webサービスが許容されるクエリのセットを制限している場合は、データベースのチューニングに大きく役立ちます。このロジックは、ストアドプロシージャにも同様に適用でき、Webサービスに固有のものではないことを付け加えておきます。

このページにも適切なリストがあります。「データベースアクセスのカプセル化:アジャイルな「ベストプラクティス」」

ただ明確にするために-これらの問題の一部は、すべての状況に適用できるとは限りません。一部の人々は、移植性を気にしません。DBセキュリティについて心配する必要がない人もいます。一部の人々は、DBのスケーラビリティについて心配する必要はありません。


26
すみません、同意しません。1.したがって、単一のプリンシパルではなくグループにDBアクセスを許可します-違いはありません。2.どのアプリでもデータをキャッシュできます。複数のユーザー間でキャッシュできるデータの種類は、通常、少量のデータです。3. FTはどのような場合でもデータベースで処理する必要があります。4.これはすぐに使える機能ではなく、プログラムする必要があります。5.データアクセス層がカプセル化を行う必要があります。6.同じこと。7.本当に?JDBCはクライアントで実行されませんか?8.良い点、それが重要な場合、まれです。9.クエリとSPは質問の一部ではありませんでした。
John Saunders、2010年

7
1.何百ものロールを持つ5000人のユーザーでそれを管理してみてください。それほどうまくスケーリングしません。2.アプリに完全に依存します。現在のケースには、クエリのキャッシュ結果のインスタンスがあります。これは、最適化されたケースでは実行に20分かかり、少なくとも異なるアプリから1日に数百回実行する必要があります。3. FTは一連のレベルで処理されます。「データベースで処理すべき」とはどういう意味ですか?
DVK 2010年

4
4.もちろん、プログラムする必要があります。ただし、一度サービスに組み込むことも、さまざまな機能を備えたさまざまなプラットフォーム上の膨大な数のクライアントアプリに組み込むこともできます。大きな違いがあります。ロードバランシングの構成管理の問題を気にしないでください。5.同じ理由。DALを再実装する必要はありません。実際のところ、WebサービスはポータブルDALであると考えることができます。7.すべてのクライアントがDB接続を開く必要はありません。そんなに大きなことを求めているのでしょうか?繰り返しますが、ポイント1〜5を忘れています。
DVK 2010年

2
8.> 1クライアントアーキテクチャは非常に頻繁に発生します。実はそのような状況のないプロジェクトに携わることは一度もありませんでしたが、私は金融の世界を中心にしています。9.そうではなかった。私は基本的に悪魔の支持者を演じていました。
DVK 2010年

2
私はこの答えが好きですが、最も重要なポイントの1つである接続プールをスキップしたと思います。1,000,000のクライアントがある場合、1,000,000の接続が開かれるか、何百万もの接続が絶えず開閉されます。コンピューターの構成に関する基本的な直感から、数百の長期接続の十分に調整されたプールは、100万の長寿命または数百万の短期接続よりも天文学的に効率的であることがわかります。HikariCPは、このアイデアについて詳しく説明する素晴らしい仕事を文書化しています:github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
Dogs

15

私の意見では、データベースをWebサービスとして自動的に公開するべきではありません。データを公開するためのサービスが必要であることが判明した場合は、サービスを記述しますが、すべてのデータベースアクセスをWebサービス経由で行う必要はありません。

  1. データベース接続が安全であってはならない理由はありません
  2. データベースをデータアクセスレイヤー(エンティティフレームワーク)にカプセル化できます。
  3. Webサービスは、適切に作成されたデータアクセスレイヤーよりも簡単に利用できます。

なぜXMLなのか?...などJSON、シンプルなフラットなデータのCSV、解析するためにもはるかに軽いあります
DVK

「理由もなく」ではありません。先に述べたように、将来の開発に対する要件と要望によっては、プロジェクトで必要になる場合があります。
Chris Stewart

DALを消費するようにWSを記述します。DALを公開するためにどのポートを推奨しますか?
samis

@samus関係ありません。
John Saunders

「データベース接続が安全であってはならない理由はありません」例えば、Windowsクライアントとデータベース間の接続を保護することは困難です。安全な接続を実装するのは本当に難しい!
NoChance 2018年

12
  • WebサービスはAPIを形成し、外部システムとアプリケーションのデータの間で許可される相互作用を定義します。
  • Webサービスは、データベースを外部の相互作用から切り離し、データ層をそれらの外部の影響から独立して管理できるようにします。
  • Webサービスのみによるアクセスを許可すると、アプリケーションロジックが実行される機会が確実に得られ、データの整合性が保護されます。
  • ユーザー名とパスワード/テーブルレベルの権限を必要とするデータベースとは対照的に、Webサービスでは、最も適切な認証/承認手段を講じることができます。
  • Webサービスは、自動サービス検出および構成を使用する機会を提供します。
  • Webサービスのトラフィックを暗号化して、セキュリティで保護されていないネットワークを通過させることができます。それを可能にする直接DB接続ソリューションを知らない...?

これらのポイントのほとんどは、特にWebサービスではなく、任意の正式なAPIに当てはまります。


1
ええ、それは私が言うつもりだった、データベースにアクセスする単一のアプリケーションがある場合、すべてのポイントは通常のAPIでも利用できます。
イグナシオソレルガルシア

「WebサービスはAPIを形成し、外部システムとアプリケーションのデータの間で許可される相互作用を定義します。」データベースでもそれを行うことができます。
2015年

「Webサービスのみによるアクセスを許可することで、アプリケーションロジックが実行できるようになり、データの整合性が保護されます」-データの整合性はDBMSの一部のみであるべきだと私は主張します。
2015年

@Shoe DBによってできるだけ多くの整合性を強制するのは良いことですが、データが入力され、いくつかの入力検証の必要性などの欠点が露呈し始めると、これをアプリケーションレベルで強制するのがいいです(ただし、クライアント側では、検証ルールがサーバーのみが知っているデータに依存している場合(クライアントアプリから保持される)、サーバー側で処理する必要がある場合があります。DBの整合性ルールセットを変更することは大きな問題ですが、それは些細な問題ではないと思いますか?
samis

2

ストアドプロシージャへの呼び出しを単純にラップするWebサービスを作成することは、優れたDALを設計するための誤ったアプローチのようです。おそらく、ストアドプロシージャは、古いクライアントサーバーシステムから残されたレガシーコードです。つまり、ビジネスルールはSPに埋め込まれています。その場合は、雌豚の耳から絹の財布を作成しようとしています。

さらに、SOAPメッセージプロトコルレイヤーを追加すると、この「豚」と付き合うように「強制」されたWebアプリにパフォーマンスヒットが追加されます。私は現在、新しいMVC-4アプリがそのようなDALを使用するように指示されているプロジェクトに取り組んでいます。このような変更を必要とする新しいユーザーストーリーが発生した場合は常に、WebMethodシグネチャとSPシグネチャの両方を変更する必要があります。私たちにとって、これはすべてのスプリントです。このようなパススルーアプローチの本質は、2つの密結合層です。


1
Web APIは、WCF / SOAP膨張問題に対処しました。今では、軽くてフィット感のある、機敏な猫のようになっています。RESTfulに提供するために必要なものだけです。
samis

理論的には、Webサービスを使用してストアドプロシージャを呼び出すことは間違いありません。
NoChance 2018年

2

1)開発者側からデータベースを維持する頭痛が軽減され、開発のみに集中できます。

2)Webサービスは、さまざまなプラットフォーム(windows、ios、androidなどのオペレーティングシステム)の通信を非常に簡単で効果的な方法でサポートします。たとえば、AndroidアプリケーションとiOSアプリケーションがJavaベースのWebサイトと通信したいという状況を考えてください。3つのことすべてを通信するには、3つの異なるデータベースを維持する代わりに、Webサービスが最善のソリューションです。


1

一般に

  1. Webサービスレベルは、複数のアプリケーションの一般的なデータ要求の再利用を促進します
  2. Webサービスは、アプリケーションレベルの開発から生じる多くの問題を回避するバージョン管理でセットアップできます。たとえば、既存のアプリケーションを使用するプロジェクトを初めて使用する場合、既存のデータベースソースを使用するようにアプリケーションを構成するための適切なモデルとして使用します。
  3. Webサービスは、シンプルなURIを使用することにより、JSONなどの一般的な形式でリクエストを送信し、応答結果を取得するための柔軟なオプションを可能にするように進化しました。

私はASP.NET Web Apiをじっと見つめ始めており、最初にデータサービスを作成することを計画しています。

私は最近、エンティティフレームワークを使用した.NET MVC Webアプリケーションに焦点を当てています。

  1. すでにMVCを使用している場合、Web APIはApiコントローラーでMVCも使用するため、サービスを構築するための学習曲線はかなり簡単です。

私は最近、もともとOracleのストアドプロシージャに基づいて構築していたMVC Webアプリの不満に悩まされていました。Oracle 9またはそれ以前の元のバージョンでは、Visual Studio 2012に別の問題があり、Web構成接続とTNS名に基づいて使用する適切なdllファイルをロード時間アセンブリで検索するという、より新しい接続ファクトリアプローチが採用されていました。

データベースへの接続試行は、「サポートされなくなりました」というエラーメッセージが表示されて失敗しました。好奇心から、Oracle 12cをダウンロードして、TNS名とロードアセンブリdllでうまく機能するアプリケーションレベルの接続をいくつか作成しましたが、Oracleで問題なく作業できました。

古いバージョンのOracleへの接続で機能するWebサービスがいくつか構築されていました。それらは、選択されたテーブルに明確にマップされたメソッドを使用して作成されましたが、残念です。自分で書く必要があります。

Oracleデータベースの保守を担当するグループは、クライアントインターフェースとビジネスロジックレイヤーを抽象化するために使用していた古いストアドプロシージャを置き換える新しいストアドプロシージャを作成することになると言われました。

したがって、私が最初に考えたのは、ドロップダウンリストへの入力や企業全体のデータでのオートコンプリートなどの一般的なデータリクエストはすべて、Oracleストアドプロシージャを呼び出すデータサービスを通じて行われるということでした。アプリケーションごとにそのプロセスを繰り返し、各開発者が構成とバージョン/ロードアセンブリ、TNSの問題に苦労するのはなぜですか?

そう....

  1. SQL Serverのデータ使用に通常EFを使用している可能性のある.NET MVCアプリケーションでOracleストアドプロシージャを使用するなど、複数のデータベースサーバーの問題については、それらの頭痛の種を、構成の問題を分離できるWeb APIサービスメソッドまで押し上げてください。
  2. この場合も、クライアントインターフェイスは、JavaScript、JQuery、およびJSONを使用して実行できます。これは、Web APIを使用してSQL Serverデータ要求を行う場合に既に使用しているものです。

私はDBAではなくアプリケーション開発者/アナリストなので、私の見方は、データベースツールが進化するときにアプリケーションを絶えず変更しなければならないという終わりのないフラストレーションの経験からのものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.