
Next.js ブログに閲覧数カウンター機能を実装しようとしたとき、 最初に思ったのは「MariaDB が使えるんじゃないか」でした。
VPS にはすでに WordPress のために MariaDB がインストールされています。 新しいソフトウェアを追加せずに済むなら、それが一番シンプルに思えました。
まず MariaDB を使う場合を調べた
MariaDB を Next.js から使うには、以下の手順が必要になります。
- Next.js 用のデータベースを新規作成する
- Next.js 専用のユーザーを作成する
- そのユーザーに適切な権限を付与する
- 接続情報を
.envファイルに書く
技術的にはできます。 ただ、作業を整理していくうちにいくつかの懸念が見えてきました。
MariaDB を選ばなかった3つの理由
理由1:WordPress のデータと混在させたくない
最も大きな懸念はこれでした。
MariaDB を共有した場合、仮に WordPress 側の DB 設定を誤ったとき、Next.js のデータにも影響が出る可能性があります。 逆も同じです。個人ブログなので管理者は自分1人。設定ミスをするのも自分、影響を受けるのも自分です。
「2つのアプリが同じ DB サーバーを共有している」という状態は、見た目よりも複雑さを持ち込みます。
WordPress で使用する DB と Next.js で使用する DB は、完全に分離しておいた方が安心だと感じるようになったのが理由の一つ目です。
理由2:設定の手間が意外と多い
「すでにある」は「すぐ使える」ではありませんでした。
Next.js から MariaDB を使うためには、専用のデータベース、専用のユーザー、そのユーザーへの権限付与という手順が必要です。
接続情報を .env ファイルで管理する設定も必要になります。
さらに Node.js から MariaDB に接続するためのライブラリ(mysql2 など)の導入と、接続が切れたときの再接続処理の設計も求められます。
「既にある」という前提で考えると軽く見えますが、実際に手を動かそうとすると、想定より多くの作業があることがわかりました。
理由3:個人ブログの規模では SQLite で十分
MariaDB の「大量同時アクセスへの強さ」は強力な特性ですが、それが活きるのは1秒間に何百件もの書き込みが発生する場面です。
個人ブログの閲覧数カウンターでその規模に達することはまず考えられません。 用途に対してオーバースペックな機能のために、設定の手間を考えると、もっと簡単な DB でも良いと判断しました。
SQLite とはどういうものか
SQLite は「ファイル1つがそのままデータベースになる」軽量なデータベースエンジンです。
MariaDB や MySQL のように「サーバープロセスが常駐して接続を待ち受ける」という仕組みではなく、アプリケーション(今回は Next.js)が直接ファイルを読み書きします。 仲介役のサーバーが存在しないため、起動・停止・設定という概念がそもそもありません。
データはすべて1つの .db ファイルに格納されます。
バックアップはそのファイルをコピーするだけで完了します。
スマートフォンのアプリやブラウザの内部データ保存にも広く使われており、「軽量・シンプル・信頼性が高い」という特性で知られています。
SQLite の基本的な操作コマンド
インストール後は sqlite3 コマンドでデータベースを操作できます。
bashsqlite3 ~/next-blog/data/views.db
このコマンドを実行すると対話モードに入ります。sqlite> というプロンプトが表示されたら入力待ちの状態です。
SQLite version 3.45.1 2024-01-30 16:01:20
Enter ".help" for usage hints.
sqlite>
対話モードで使う主なコマンドは以下のとおりです。
| コマンド | 内容 |
|---|---|
| .tables | データベース内のテーブル一覧を表示する |
| .schema テーブル名 | テーブルの構造(カラム定義)を表示する |
| .headers on | SELECT 結果にカラム名を表示する |
| .mode column | SELECT 結果を列揃えで表示する |
| .quit | 対話モードを終了する |
実際に今回使ったテーブルの中身を確認する場合はこうなります。
sql.headers on .mode column SELECT * FROM total_views ORDER BY count DESC LIMIT 5;
url count
---------------------------- -----
/posts/first-article 42
/posts/second-article 18
また、対話モードを使わずにコマンドから直接 SQL を実行することもできます。 これはシェルスクリプトから呼び出す場合などに便利です。
bashsqlite3 ~/next-blog/data/views.db "SELECT * FROM total_views ORDER BY count DESC LIMIT 5;"
テーブル作成のように複数行にわたる SQL を実行する場合は、ヒアドキュメント(<< 'EOF')を使います。EOF と EOF の間に書いた内容がそのままコマンドとして渡されます。
bashsqlite3 ~/example-blog/data/views.db << 'EOF' CREATE TABLE IF NOT EXISTS total_views ( url TEXT PRIMARY KEY NOT NULL, count INTEGER NOT NULL DEFAULT 0 ); EOF
Node.js から SQLite を操作するライブラリ
ターミナルから直接操作するだけでなく、Next.js のコードから SQLite を読み書きするためには better-sqlite3 というライブラリを使います。
bashnpm install better-sqlite3 npm install --save-dev @types/better-sqlite3
better-sqlite3 を選んだ理由は、同期処理で動くからです。
「閲覧数の書き込みが完了してから次の処理に進む」という順序が保証されるため、二重カウントやデータの破損が起きにくくなります。
MariaDB と SQLite の比較まとめ
| 観点 | SQLite | MariaDB(既存) |
|---|---|---|
| 追加インストール | sqlite3 コマンドのみ | 不要(既にある) |
| 追加設定 | ほぼ不要 | DB・ユーザー・権限の設定が必要 |
| WordPress との分離 | 完全に分離できる | 同じサーバーを共有する |
| バックアップ | ファイル1つをコピーするだけ | mysqldump コマンドが必要 |
| 同時アクセス耐性 | やや弱い | 強い |
| 動作の仕組み | ファイルを直接読み書き | サーバープロセスが常駐する |
「既にあるものを使わない」という選択は、最初は非効率に見えました。 でも設定コスト・分離の安心感・用途との適合性を並べると、SQLite の方が今の自分の状況に合っていると判断できました。
結果として
SQLite の導入は sqlite3 コマンドのインストールと better-sqlite3 ライブラリの追加だけで完了しました。
データベースは ~/example-blog/data/views.db という1つのファイルです。
バックアップもそのファイルをコピーするだけ。 デプロイのたびに上書きされることもありません。 今のところ、この判断は正解だったと思っています。
SQLite の実装を含む第18回の全体手順は LIFEWORK Blog でまとめています。





