.NET Core な時代にMySQLとPostgreSQLのどちらを選択すべきか


はじめに

マルチプラットフォームで動作する .NET Core を現在試しているのですが、大分現実のプロダクトに採用できるレベルに達してきているという感触を持っています。

マルチプラットフォームで .NET Core アプリケーションが動作するだけでなく、開発環境である Visual Studio Core もマルチプラットフォーム対応でよくできているためです。

また、Visual Studio 自体も、Visual Studio for Mac が提供されており、.NET Core での開発が行いやすい環境が整備されつつあります。

.NET Core は、次の時代を担う技術になりうるポテンシャルを持っていると言えるでしょう。

概要

この記事では以下の内容を解説します。

  • .NET Core とはなんなのか
  • クラウド時代に求められるインフラ
  • なぜ今 .NET Core なのか
  • Java サポート問題とOracleリスク
  • データベースファーストとモデルファースト
  • .NET Core の MySQL と PostgreSQLのサポート状況
  • 結論:MySQL と PostgreSQL のどちらを選ぶべきか

.NET Core とはなんなのか

.NET Core を一言で表現するのであれば、「マルチプラットフォームで動作する Web システムのための .NET 実装」ということになるでしょう。少なくとも現時点では。

なぜ Web システムに限定されるのかですが、これは Windows の .NET Framework と.NET Core の違いを理解する必要があります。両者は名前は似ていますが、その立ち位置はまったく別物です。

以下の図は、Microsoft の記事の引用ですが、.NET Framework と .NET Core の違いを端的に示しています。

f:id:fnyablog:20180908144156p:plain

.NET Standard - .NET Core と .NET Standard の分かりやすい解説

Xamarin についてはこの記事で直接関係しないため割愛しますが、.NET Framework と .NET Core はどちらも .NET Framework BCL という .NET の基本機能の上で作成できるアプリケーションが決められています。

一番大きな違いは、.NET Framework は Windows でのみ動作し、.NET Core は Windows / Mac / Linux というマルチプラットフォームで動作するということです。

また、Windows の機能に依存している Windows アプリケーションは.NET Framework だけで作成可能で .NET Core には含まれず、.NET Core では Console と ASP.NET Core アプリケーションのみ作成可能です。

端的に言えば、.NET Core とはマルチプラットフォーム対応の ASP.NET Core アプリケーションを構築するプラットフォームと言えるでしょう。

クラウド時代に求められるインフラ

今さら言うまでもなく、現在はクラウド時代です。企業内のデータセンターで動作するオンプレミスなシステムはなくなりはしませんが、Web システム、Web サービスなどは急速にクラウドに移行しています。これはデータを示すまでもなく、Amazon Web Services や Microsoft Azure の人気の高さを見れば分かります。

さて、クラウド時代のインフラに求められることとはなんでしょうか?

それは、柔軟なシステム構成であったり、容易にスケールアップできたり、ディザスタリカバリができたりといろいろあると思いますが、なんと言ってもコストが安いということでしょう。

このコストが安いことが求めれられるクラウド時代に、ライセンスモデルである Windows Server は Linux の後塵を拝するようになりました。サーバーを増やしてスケールアウトする度にライセンスを購入して費用がかかるようでは、スピードが遅すぎてやむを得ないことと言えます。

但し、Microsoft も指をくわえて見ているだけではなく、自身も PaaS (Platform as a Service) に分類される Microsoft Azure というクラウドサービスを展開し、使用した分だけコストを払う方向へシフトしています。

とはいえ、Linux 全盛期であるクラウド時代、Linux で動作しない .NET Framework を Microsoft が主力技術とするのはさすがに無理があります。この問題を解決するのが .NET Core になります。

なぜ今、.NET Core なのか

クラウド時代に Linux で動作する技術を Microsoft が持たないといけないことは自明のことと言えるでしょう。

Microsoft は早い段階でそれを見抜き、2014年11月の段階でサーバーサイドの .NET Framework をオープンソース化して、Mac や Linux でも動作させると発表しています。

そして、.NET Core 1.0 の正式版がリリースされたのが2016年6月のことです。現在は .NET Core 2.1.4 までバージョンアップされています。

.NET Core のおかげで、Microsoft はクラウド時代に対応しうる技術基盤を得たと言えるでしょう。

また、昨今、プログラム言語の静的型付けが見直されており、大規模なシステム開発では静的型付けなプログラム言語が選ばれることがあります。特にフロントエンド開発で顕著ですが、JavaScriptという動的な型であるスクリプト言語が限界を迎え、TypeScript などの静的型付け言語に移行しつつあります。

やはり、静的型付けでないスクリプト言語は、さっと手軽に作るのには向いているのですが、大規模開発で型変換の問題が起きたら問題解消に時間がかかり過ぎてしまうため、コンパイル時点で問題を発見できる静的型付けが見直されています。

この点からも、C# という静的型付けのプログラム言語を擁する .NET Core は時代に合っているといえるでしょう。

Java サポート問題と Oracle リスク

Oracle が買収した企業のソリューションは悲しい終わり方をすることがあります。

例えば、Solaris はメジャーバージョンアップはもう行わない上に関係者が大量にレイオフされたというニュースがありました。また、OpenOffice も結局手放してしまいました。その後、OpenOfficeは継続の危機の向かえることになります。

そして、Java です。

Java と言えば、サーバーサイドの静的型付けプログラム言語としては一番メジャーな言語で多くの企業のシステム開発で利用されています。

人気の理由は、安定した実行環境と長期のサポート、良質なフレームワークの存在、技術者の多さなど多くあります。

しかし、2018年になってから Oracle は Java のサポートポリシーを大きく変更しました。その内容は、半年ごとにメジャーバージョンアップを行い、おそらくリリースから1年間はマイナーアップデートが行われますが、これでサポート終了です。

しかも、2018年9月の Java 11 以降は Oracle と有償契約を行ったユーザーしか JDK を利用することができなくなってしまいます。OracleはOpenJDK で同等の機能を提供すると言っていますが、これは大きなインパクトのある変更です。

あの Java ですらそうなのですから、Oracle と競合関係にある Oracle 傘下の MySQL も油断はできません。

MySQL がいつどうなるか分かりません。これを嫌った開発者が MySQL をフォークした MariaDB をオープンソースで開発しており、RedHat Enterprise Linux や CentOS では MariaDB がデフォルトのデータベースになりました。

これはもう Oracle リスクと言えるのではないでしょうか。

データベースファーストとモデルファースト

現在、システム開発領域では、主にデータベースファーストとモデルファーストという2つのモデルが存在します。

データベースファーストとは一般的な開発で、データベースの定義を決めてからコーディングを行うというモデルです。但し、データベースに変更が入った場合、多くの修正がプログラムに入るため古いモデルと言われることもあります。

一方、モデルファーストとは、ソースコードのクラス定義からデータベースを構築するというアプローチをとるモデルです。Ruby on Rails で有名になった手法だと理解していますが、ソースコードの変更に合わせたデータベース変更ができるため開発生産性が高いようです。こちらは比較的新しい手法と言えるでしょう。

どちらが優れているとは一概には言えませんが、エンタープライズな分野ではデータベースファースト、Webサービスな分野ではモデルファーストが向いていると言えるかもしれません。

.NET Core の MySQL と PostgreSQLのサポート状況

.NET Core は MySQL と PostgreSQL の両方をサポートしています。

正確には、MySQL と PostgreSQL のそれぞれが .NET Core 用の Nuget パッケージを提供しています。

また、.NET Core は MySQL と PosterSQL のデータベースファーストとモデルファーストの両方をサポートしています。

しかし、落とし穴があって、MySQL のデータベースファーストはほとんど使い物にならないという点です。動作しないため記事にできなかったのですが、非常に簡単なテーブルをデータベースファーストでモデル生成しようとすると、「method not implemented」 というエラーが発生してまともに動作しません。未実装とはやる気あるのか?と疑うレベルです。プレビュー版まで試しましたが、解決されていないので当分このままでしょう。

最初は、MySQL を採用しようと考えていましたが、このエラーのために一気にその気がなくなりました。

結論:MySQL と PostgreSQL のどちらを選ぶべきか

ネット上のどの記事を見ても、PostgreSQL と MySQL のどちらを選ぶべきかというタイトルを付けていても、最終的には PostgreSQL は高機能が売りで、MySQL は機能は少ないが高速で動作し、どちらを選んでもいいという結論になっています。

しかし、新規プロジェクトでオープンソースのデータベースを採用するのであれば、モデルファーストとコードファーストの両方を正常にサポートしている PostgreSQL 一択ではないかと考えます。Oracle リスクも当然考慮してのことです。

データベースなら商用でもよいというなら、SQL Server on Linux という選択肢もなくはないのですが、まだ実績が少ないことと価格が明らかになっていないことで見送っています。

この記事の結論としては、.NET Core では MySQL よりも PostgreSQL を選択すべきとなります。

おわりに

いろいろな側面から .NET Core な時代に MySQL と PostgreSQL のどちらを選択すべきか考えてきましたが、いかがだったでしょうか。

この記事では PostgreSQLを採用しましたが、コードファーストだけなら MySQL という回答もあるかもしれません。

急速に成長しているプロダクトなので、今後の動向に注視していきたいですね。

参考サイト