- 同じRDBMSなのに、なぜこんなに違うのか
- PostgreSQLの前提:データが最優先
- MySQLの前提:アプリケーションが最優先
- GROUP BYが象徴する思想差
- 型変換の違い
- なぜ方向が分かれたのか
- 後から起きた逆転現象
- 現在の違い
- 開発で受ける影響
- どちらを選ぶべきか
- まとめ
同じRDBMSなのに、なぜこんなに違うのか
MySQLとPostgreSQLはどちらもRDBMSです。
テーブルがあり、SQLで操作し、トランザクションもあります。
表面的には非常によく似ています。
しかし実際に触ると、挙動の“感触”がまったく違います。
同じSQLを書いているはずなのに、片方では動き、もう片方ではエラーになります。
これは性能差ではありません。
設計思想の違いです。
そしてその違いは、かなり早い時期に決定的に分かれました。
PostgreSQLの前提:データが最優先
PostgreSQLの基本思想はシンプルです。
「正しくないデータは保存しない」。
この前提のもとでは、曖昧な問い合わせは許されません。
例えば次のSQLです。
SELECT id, name FROM users GROUP BY id;
標準SQLでは不正です。
PostgreSQLは明確にエラーにします。
これは不親切ではありません。
データの意味が曖昧な結果を返さないためです。
PostgreSQLは一貫して、SQL標準への準拠を重視してきました。
挙動は一見厳しいですが、結果の再現性が高いのが特徴です。
MySQLの前提:アプリケーションが最優先
一方のMySQLは、まったく違う方向を向いていました。
「動くこと」を優先します。
同じSQLでも、昔のMySQLは実行しました。
そして何らかの結果を返しました。
Web開発では、エラーで止まるより結果が出る方がありがたい場面が多かったからです。
つまり両者の違いはこうなります。
PostgreSQL
- データベースがルールを守る
MySQL(初期)
- アプリケーションを止めない
ここが最初の分岐点です。
GROUP BYが象徴する思想差
GROUP BYの扱いは、両者の違いを最も分かりやすく表します。
PostgreSQL
- 不正SQLとして拒否
MySQL(旧)
- 実行して値を返す
この差は小さく見えますが、システム設計に大きく影響します。
MySQLでは、開発者はSQLの厳密性をあまり意識せずに済みます。
PostgreSQLでは、SQLの意味を理解していないと動きません。
型変換の違い
もう一つの分岐点が型です。
INSERT INTO users (age) VALUES ('abc');
PostgreSQLはエラーです。
MySQL(旧)は0として保存します。
PostgreSQL
- 入力値の誤りを検出
MySQL(旧)
- 入力値を補正
どちらが正しいというより、役割の考え方が違います。
なぜ方向が分かれたのか
背景には対象ユーザーの違いがあります。
PostgreSQLは研究・企業用途の流れを引いています。
データの正確性が重視されました。
一方MySQLは、Web開発の爆発的普及とともに広がりました。
個人開発者や小規模チームが主な利用者でした。
必要とされたのは厳密さより導入のしやすさです。
この時点で、両者は別の問題を解いていました。
後から起きた逆転現象
興味深いのは、その後です。
MySQLは徐々に厳格化しました。
- InnoDBの標準化
- SQLモードの強化
- STRICTモード
つまり、MySQLはPostgreSQLに近づいていきました。
ただし完全に同じにはなりません。
歴史的背景が違うため、設計の優先順位が異なります。
現在の違い
現在の傾向を簡単にまとめると次の通りです。
PostgreSQL
- 一貫性重視
- 標準準拠重視
- 拡張機能が豊富
MySQL
- 互換性重視
- 運用の簡単さ重視
- Web用途との親和性
これは性能差ではありません。
設計の価値観の違いです。
開発で受ける影響
実務では、次の部分に差が出ます。
- 集計クエリ
- NULLの扱い
- 文字列比較
- トランザクションの考え方
特に移植時に問題になります。
MySQLで動いたSQLをPostgreSQLへ持っていくと、多くがエラーになります。
逆方向では、動くことは多いですが挙動が変わることがあります。
どちらを選ぶべきか
優劣の問題ではありません。
適した用途が違います。
データの厳密性が最優先ならPostgreSQLが向きます。
既存のWebシステムとの互換性や運用の容易さを重視するならMySQLが扱いやすい場合があります。
重要なのは、「同じRDBMSだから同じ」と考えないことです。
まとめ
MySQLとPostgreSQLの違いは機能数ではありません。
何を守ろうとしているかの違いです。
PostgreSQLはデータの意味を守ろうとします。
MySQLはアプリケーションの動作を守ろうとしてきました。
現在のMySQLは厳格化していますが、歴史の影響は残っています。
そのため両者は似ていても、完全に同じ感覚では扱えません。
データベース選択で重要なのは、性能比較より設計思想の理解です。
その違いを理解したとき、なぜ同じSQLでも結果が変わるのかが見えてきます。