SQLiteとPostgreSQLは、どちらもRDB(リレーショナルデータベース)ですが、そもそもの成り立ちがまったく異なります。この違いを理解しないまま「試作で使ったSQLiteを、そのまま本番でも使い続けてしまう」というのは、よくある失敗パターンです。
データベースの種類を一覧で確認したい方は、 データベースの種類とは?RDB・NoSQLの違いと選び方 もご覧ください。
PostgreSQLは、常駐する「DBサーバー」に対して、アプリケーションがネットワーク経由で接続する方式です。専用のプロセスがリクエストを受け付け、複数の接続を管理します。
一方SQLiteは、DBサーバーというものが存在しません。データベースの実体は1つのファイルであり、アプリケーションのプログラムに組み込まれたライブラリが、そのファイルを直接読み書きします。この「サーバー不要」という特性が、両者の得意分野を大きく分けています。
実際に手を動かして確かめてみましょう。以下のデモは実際の通信を一切発生させません。5件の書き込みリクエストが同時に来た場合の処理のされ方を見比べてください。
実際の通信は発生しません。5件の書き込みリクエストが同時に来た場合の処理のされ方を見比べてください。
ボタンを押すと、処理にかかった時間がここに表示されます。
SQLiteモードでは、5件のリクエストが1件ずつ順番に処理され、後ろのリクエストほど待ち時間が伸びていったはずです。これは、SQLiteがDBファイル全体に対して1つの書き込みロックしか持てない設計になっているためです。PostgreSQLモードでは、5件が同時並行で処理され、全体の完了までの時間が大幅に短くなりました。
サーバーのセットアップが不要で、ファイルをコピーするだけでデータを丸ごと持ち運べる手軽さは、PostgreSQLにはない大きなメリットです。
「同時に何人が書き込むか」が、SQLiteとPostgreSQLを分ける最も実務的な判断基準です。個人開発では快適に動いていたSQLiteのアプリが、公開して利用者が増えた途端に書き込み待ちで詰まる、というのはよくある失敗パターンです。
ORMを使ったDB設計の柔軟性については、 DBを柔軟に設計できるWebアプリ開発 でも解説しています。
SQLiteとPostgreSQLの違いは、機能の多さではなく「DBサーバーを持つかどうか」「同時書き込みにどこまで耐えられるか」という設計思想の違いです。試作段階ではSQLiteの手軽さを、本番運用ではPostgreSQLの並行処理性能を、それぞれ活かすのが実務上の基本になります。