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

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

ただいまの
回答率

88.09%

クライアント端末の通信は、直接DBに接続するか、WebAPIを経由すべきか...?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 9,385

score 174

近いうちに、Windowsタブレット(通常のWindowsPCと変わりませんが。。。)を使った業務系アプリケーション(工場で利用する想定)を開発します。
そこで、クライアント端末側で直接データベースに接続するか、
サーバー側でWEBAPIを作り、サーバー側で処理を行い結果をJSON等で返却するようにしようか悩んでいます。
皆様なら、どういう構成にしますか?
メリット・デメリット等あると思いますが、理由も併せてご回答いただけると嬉しいです。

★ クライアントの構成
OS:Windows 10
開発言語:C#(WPFで作成予定)

★サーバーの構成
OS:Linux(Cent OS)
フレームワーク: ASP.NET MVC Core
データベース: PostgreSQL

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

WPFでアプリを書くならダイレクトにDBにアクセスする方が楽ですよとコメントするところですが、PostgreSQLだとNpgsqlを使うことになると思うので、素直に定番の環境でWebAPIを書いた方がよいかもしれませんね
ハマりどころが少なくなるのではという意味で

あとWebAPIを使うと(特にJSON)型情報を持ちまわるのに面倒だったりすることがありますね
そういう意味ではWCFが使えると相当楽ですけど

あまり聞かない=知見が少ないなので、ハマるといろいろ自分でやらないといけない
→業務アプリケーションは定番構成を選択しておいた方がいいと思いますよ

もちろんいろんな挑戦を否定するわけではありません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 11:13

    ASP.NET MVC だとデフォルトで「JSON」なので楽かもしれませんね!

    > 実は自分も様子見です。構成ファイル他の変更が多くて今までの知識では歯が立たないし、以下のよう> な不具合(?)もまだ残っているようですし、業務上の差し迫った必要もないですし。(笑)
    >
    > ASP.NET Core で文字化け
    > http://surferonwww.info/BlogEngine/post/2017/06/16/decoding-problem-caused-by-view-
    > created-by-scaffolding-in-aspnet-core-project.aspx
    事例があまりなく、まだ安定していないので悩ましいところではあるんですよね。
    リスク考えるとWindowsサーバー+SQLServer + ASP.NET MVC5(.NET Framework)無難ですよね・・・。

    悩みが増えていきます。。。

    キャンセル

  • 2017/06/23 17:42

    > ASP.NET Core では変わっていて「面倒だったりする」ということがあるのでしょうか?
    そんなに深い考えではなく、JSONを扱うのは面倒くさくないですかという意味で書きました
    私だけの思い込みかもしれません

    ASP.NET Web APIだとシリアル化の形式をJSONからXMLに変更できますけど、ASP.NET MVC Coreではどうなんでしょう?

    キャンセル

  • 2017/06/23 18:35

    JSONにするのは全然難しくない感じです。
    基本的にはASP.NET MVCの延長戦上みたいな感じです。
    .NET Framwork上で動くわけではなくなるので、環境構築や既存の資産が使えなくなる(まだ対応しているライブラリは少ないように思えます)のが痛いところですね。。。
    予算があまりない小規模な案件ということもあって、採用を検討しているところですが、
    少し大きい案件でしたら、Windowsサーバー等を使った方が無難な印象です!

    XMLも対応できるみたいです。
    ASP.NET Core MVC の Web API で XML 形式のデータを扱う
    http://www.moonmile.net/blog/archives/7963

    キャンセル

+1

入出力の一元管理や定番のセキュリティで済む、WEBAPIでいいんじゃないですかね。
機能限定版を、Webで作ってというのも対応できますし。

UWPでは、WEBAPIのみなので、それが時代の潮流なんだと思います。
(安いWinタブレットはUWPのみとかこれからありそうですし)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 08:50

    ご回答ありがとうございます。
    UWPは、データベースに接続するAPIがないんでしたよね!
    業務系アプリケーションでUWPか、WPFかでも悩んだりしました!

    キャンセル

+1

サーバー側が Linux、ASP.NET Core、PostgreSQL ということなのでいろいろ制約がありそうですが(Core で使えるプロバイダがあるのかとか?)、それを考えなければ、

Client (Borwser) ⇒ Web Server(ASP.NET MVC Core)⇒ DB Server (PostgreSQL)

という構成が良いと思います。

メリットは、

(1) アプリは全てサーバー側で管理可(クライアントのアプリの保守は不要)

(2) クライアントはブラウザさえあれば Windows 端末でなくても OK

・・・と言ったところでしょうか。

デメリットは、クライアントを WPF にするのに比べれば、なさそうに思います。

上に「いろいろ制約がありそう」と書いた件については、PostgreSQL には触ったこともない自分は知識がないのですが、ASP.NET MVC Core と PostgreSQL の間を取り持つプロバイダ / ドライバが完備しているかということが一番気になるところです。

(.NET Framework ベースなら Npgsql というものが用意されていて Entity Framework も使えるそうですが・・・)

Core で使えるプロバイダ / ドライバがないということですと、以下のような構成にせざるを得ないと思います。

Client (.NET + WPF + Npgsql) ⇒ DB Server (PostgreSQL)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 10:11

    ご回答ありがとうございます。
    NpgsqlのCore版があって一応検証済みです(Linux上で)!
    ASP.NET MVC CoreがでたのでWindowsサーバーを避けて、コストを下げようとしてちょっと変な構成になってます(汗
    もうc#にこだわる必要もないのではという気もしなくはないのですが...
    Web側だけPHPなどのスクリプト言語でもよいかもとはちょっと思ってます。。。

    キャンセル

  • 2017/06/23 11:05 編集

    > NpgsqlのCore版があって一応検証済みです(Linux上で)!

    了解しました。情報をありがとうございます。

    たぶん、Entity Framework も使えるのではないかと想像していますが、そうであれば、上の回答に述べた Client (Borwser) ⇒ Web Server(ASP.NET MVC Core)⇒ DB Server (PostgreSQL) の構成がよさそうだと思います。

    キャンセル

+1

前提条件が違うので参考にはなりませんが、
Mysql+WPFであれば直接コントロールできますし、高速で動作します。
(実績あり)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 12:42

    ご回答ありがとうございます。
    レイヤーがひとつ減る分早くなりますよね。
    今回開発するのが小規模なので、それでもいいのかなとも思ってたりします。。。

    キャンセル

+1

工場で使うアプリということで、ユーザー数は少ないと思います。
もしユーザーが多く負荷が高い場合は「Web APIを作り、Webサーバー側で処理を行い結果をJSON等で返す」が良いでしょう。

  • Web APIにすると同じクエリに対する結果のキャッシュが簡単(高速&DB負荷低減)

キャッシュが全く効かないようなアプリの場合、高速化/負荷低減のメリットはないので直接DBにアクセスした方が良いように見えます。

もしセキュリティが重要ということであればWeb APIが良いかも知れません。

  • Webサーバーを経由することにより、DBサーバーへの直接アクセスを防止できる。
    -- APIを経由することによりDBに対する操作を制限できる。
    -- DBサーバーへの直接ログインを無くせる。(PostgreSQLにも稀に権限昇格などの脆弱性がある)
  • ユーザー管理/責任追跡/否認防止はWebアプリの方が簡単かも知れない。
    -- 直接DBに接続でき、DBのユーザーIDが漏洩した場合、簡単に何でも出来てしまうかも知れない。PostgreSQLの脆弱性はありまり多くありませんが、時々見つかっています。ユーザー権限(アクセスできるテーブルなど)管理の手間も無視できないかも知れない。
    -- セキュリティ要素として責任追跡/否認防止が必要な場合、DBサーバーにシステムユーザー毎にDBユーザーアカウントを作ることになる。PostgreSQLで多数のユーザーを管理するのは結構手間になるかも知れない。
  • Webサーバーを経由する方が可用性を維持し易いかも知れない。(ホットスタンバイの切り替えなど)

システム要求仕様が不明なのでほとんど「かも知れない」です。これらが重要な場合かつWeb APIの方が都合が良い場合はWeb APIにした方が楽だと思います。

もし、直接DBに接続する方が色々と都合が良い(既に直接DBアクセスするアプリがあり、DBユーザーの管理をきっちりやっている等)場合は直接DBに接続する方が良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/27 20:27

    ご回答ありがとうございます。
    対象の企業が小さい会社で、システム化部門があるわけでもない状況です。
    (今回はインターネット上に公開せず、イントラ内で動くアプリになります。)

    僕が悩んでいた点は以下の点です。
    DBに直接つなぐ場合:
     クライアント端末に直接接続文字列が記載されるのに心理的抵抗がある。
    WebAPIにする場合:
     今回作成するアプリは比較的小規模、かつ、少ないメンバで開発するので、クライアント開発者と、サーバーサイド開発者が同一人物になりうるため手間となる(気がする)

    (今はWebAPIよりです。。。)

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る