毎日開くブラウザ、スマホのメッセージアプリ、あるいはデスクトップ上のメモツールの中に、すべて同じ軽量データベースが隠されていると考えたことはありますか?
サーバーソフトウェアのインストールは不要で、アカウントやパスワードの設定も要らず、インターネット接続すら必要ありません。それは単なる ファイル であり、ハードディスクに静かに横たわり、いつでもサービスを提供する準備ができています。
この控えめな存在こそが、SQLite です。
SQLite とは?世界で最も広く導入されているデータベース
SQLite は、C 言語で書かれた 組み込み型関係データベースエンジン です。
独立したサーバープロセスを持たず、アプリケーションに直接組み込まれて動作します。
これは、お馴染みの PostgreSQL や MySQL とはまったく異なります。従来のデータベースは 独立して動作するサーバー であり、プログラムは ネットワークプロトコル(TCP/IP) を介してそれと「通信」する必要があります。
しかし、SQLite は違います。それは単なるコードのブロックであり、アプリケーションの内部で直接実行され、ハードディスク上の .db ファイルを読み書きします。
| 比較基準 | SQLite(組み込み型) | PostgreSQL(クライアント・サーバー型) |
|---|---|---|
| 動作モード | アプリケーションに直接組み込み、独立サーバーなし | 独立したサーバープロセス、ネットワーク接続経由 |
| 設定要件 | ゼロ設定、インストール不要、認証情報不要 | インストール、アカウント/パスワード設定、ファイアウォールが必要 |
| データ保存 | 単一のクロスプラットフォームファイル | サーバーディレクトリ配下の複数ファイル |
| バックアップ方法 | そのファイルを直接コピーするだけ | pg_dump などの専用ツールが必要 |
まさにこの 「プラグアンドプレイ」 の特性により、SQLite は世界で最も広く導入されているデータベースエンジンとなりました。
Android や iOS オペレーティングシステム、Chrome や Firefox ブラウザから、Adobe Lightroom、WhatsApp、さらには Airbus A350 の飛行システムに至るまで、いたるところに存在しています。
Node.js での SQLite の使用
Node.js 開発者であれば、SQLite の使用は非常に簡単です。コンピューターにデータベースサーバーソフトウェアをインストールする必要はなく、npm パッケージをインストールするだけで開始できます。
現在、業界で最も一般的に使用されている選択肢:
| パッケージ名 | 特徴 | 推奨されるシナリオ |
|---|---|---|
sqlite3 |
最も老舗、非同期 API をサポート | 多数 of 非同期タスクを同時に処理する必要がある場合 |
better-sqlite3 |
優れたパフォーマンス、直感的な API 設計、極めて高速 | 第一推奨、開発効率と実行速度を追求する場合 |
better-sqlite3 を使ってデータベースを作成し、クエリを実行するのに 5 分もかかりません:
const Database = require('better-sqlite3');
const db = new Database('my_project.db');
db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();
const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);
const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }
ファイルが存在しない場合、
better-sqlite3が 自動的に作成します。
SQLite は想像以上に強力な SQL 構文をサポートしている
多くの人は SQLite が非常にシンプルだと思っていますが、実際には以下のような高度な機能を含む、標準的な SQL 構文の大部分をサポートしています:
| 構文カテゴリ | サポート項目 |
|---|---|
| 基本操作 | SELECT、INSERT、UPDATE、DELETE |
| データ定義 | CREATE TABLE、CREATE INDEX、CREATE VIEW |
| 高度なクエリ | WITH(再帰的 CTE)、ウィンドウ関数(Window Functions) |
| 衝突処理 | UPSERT(INSERT ... ON CONFLICT DO UPDATE) |
| JSON 処理 | json_extract、json_array、json_object などの組み込み関数 |
| トランザクション制御 | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
| 結合クエリ | INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN |
SQLite のコア哲学は「スモール・イズ・ビューティフル」 です。日々必要な SQL 機能の大部分をサポートしつつ、極限まで軽量さを維持しています。
SQLite の限界はどこにある?
軽量さには代償が伴います。もし SQLite を レジが 1 つしかない個人経営の雑貨店 に例えるなら、PostgreSQL は 50 個のレジを備えたコストコ です。
1. 書き込みの渋滞
SQLite はデータを書き込む際、データベースファイル全体を ロック します。
トイレが 1 つしかないレストラン を想像してみてください。100 人が外で同時にメニューを見る(読み取り)ことはできますが、誰か 1 人が入ってドアに鍵をかける(書き込み)と、他の全員は並んで待つしかありません。
WAL モード(Write-Ahead Logging) を有効にすれば、同時読み書きのパフォーマンスは向上しますが、本質的に複数のスレッドが異なるデータ行に同時に書き込むことはできません。
2. 複数サーバー間での共有不可
SQLite の本質は物理ファイルです。システムを複数のサーバーにデプロイする場合(水平スケーリング)、これらのサーバーで 同じファイルを安全に共有することはできません。
3. きめ細かな権限管理の欠如
SQLite には「ユーザーアカウント」という概念がありません。OS レベルでその .db ファイルを読み取れる人であれば、誰でもすべてのデータを閲覧・変更できます。
厳格な個人情報監査が必要なビジネスシステム において、这是無法接受的。
SQLite vs. PostgreSQL:技術選定の意思決定
ツールに優劣はなく、適しているかどうかがすべてです。判断を助けるための究極のチェックリストを紹介します:
| 質問 | 回答が「はい」 → SQLite を選択 | 回答が「いいえ」 → PostgreSQL を選択 |
|---|---|---|
| バックエンドサーバーは 1 台だけ、またはローカルのみで動作していますか? | はい | いいえ(水平スケーリング、複数マシンが必要) |
| システムの動作は読み取りが圧倒的に多く、高頻度の同時書き込みはありませんか? | はい | いいえ(同時書き込みが多発する) |
| きめ細かな権限管理や、高度なインデックス機能は不要ですか? | はい | いいえ(高度な機能に強く依存している) |
より具体的なシナリオ比較:
| シナリオ | 推奨される選択肢 | 理由 |
|---|---|---|
| デスクトップソフト、スマホアプリ、IoT 機器 | SQLite | データがデバイスに追従し、インストール不要 |
| 個人ブログ、紹介用ホームページ | SQLite | 参照が多く書き込みが少ないため、サーバー維持費を削減可能 |
| 迅速なプロトタイプ開発、デモ | SQLite | ファイルを作成するだけで即座に開始可能 |
| コミュニティフォーラム、EC サイト | PostgreSQL | 高い同時書き込みが発生し、行レベルのロックが必要 |
| 複数サーバーへの分散デプロイ | PostgreSQL | 複数マシン間でデータソースを共有する必要がある |
| 医療、金融などの機密システム | PostgreSQL | ロールベースの厳格な権限管理が必要 |
あなたのデータベースはポケットのメモ帳か、それとも中央交換手か
データが 「シングルマシン、静的、単一の所有者」 であるなら、SQLite を選んで究極の軽快さと自由を享受しましょう。
データが 「クラウド、動的、高度なインタラクティブ」 であるなら、PostgreSQL に任せましょう。
SQLite のコア哲学は 「アプリケーション of 内部コンポーネント」 であるのに対し、PostgreSQL は 「システムアーキテクチャ of 独立した中心」 として位置づけられています。
次回、アーキテクチャの意思決定を行う際は、急いで PostgreSQL を持ち出す前に、まず自分自身に問いかけてみてください:
「私のデータベースは、ポケットのメモ帳ですか、それとも中央交換手ですか?」
答えがはっきりすれば、選択は自然と明らかになります。