【db.c】MacとC言語でデータベースをゼロからビルドしてみた完全実録
データベースの内部構造を理解するために、SQLiteの構造をモデルにした「db.c」をMac(Apple Silicon)環境で動かしてみました。環境構築から、誰もが抱く「あの疑問」の解決まで、省略なしの全行程を記録します。
1. 開発環境の準備:Xcode Command Line Tools
【 現場の感触 】 MacでC言語をコンパイルするには、Apple純正のコンパイラ(Clang)が必要です。まずはターミナルから、開発の「儀式」とも言えるツールのインストールから始めます。
xcode-select --install
※すでにインストール済みの場合は「already installed」と表示されます。未導入ならポップアップに従ってインストールを完了させてください。
2. ソースコードの取得とディレクトリ作成
【 現場の感触 】 作業用フォルダを作成し、GitHubから最新の db.c をダウンロードします。curlコマンドを使って、GitHubのマスターリポジトリから直接保存します。
mkdir ~/db-study && cd ~/db-study
# ソースコードのダウンロード
curl -O https://raw.githubusercontent.com/cstack/db_tutorial/master/db.c
3. コンパイルの実行
【 現場の感触 】 Mac標準のコンパイラ(Clang)を使用して、ソースコードを実行可能なバイナリファイルに変換します。エラーが出なければ、同じフォルダ内に「db」という実行ファイルが作成されます。
clang db.c -o db
# 実行ファイルができたか確認(lsコマンド)
ls -F
→ db* と表示されれば準備完了です。
4. データベースの起動と操作(実践)
【 現場の感触 】 実際にプログラムを動かし、データを入力してみます。ここで驚くのが、「CREATE TABLE」を一度も叩かずに insert ができてしまうことです。
./db mydb.db
db > insert 1 user1 person1@example.com
Executed.
db > insert 2 user2 person2@example.com
Executed.
db > select
(1, user1, person1@example.com)
(2, user2, person2@example.com)
db > .exit
5. 【重要解説】なぜ「表」を作らなくても入るのか?
【 仕組み 】 通常のDBではありえないこの挙動の理由は、ソースコードの中にあります。この `db.c` は、「ID、Username、Email」という3つの列を持つ1つのテーブルしか扱えないように、最初から「構造」がプログラムに直接書き込まれている(ハードコードされている)からです。
・通常の汎用DB:何が来るか不明なため、まず「表の定義(メタデータ)」を作る必要がある。
・自作 db.c:最初から「ID(4byte)、名前(32byte)、メルアド(255byte)」という1行291byteの固定データが来ると知っている。
★ メリット:
1行のサイズが常に一定(固定長)なので、n行目を探すには「291 × n」バイト目を見に行くだけで済みます。この割り切りが、自作DBの学習をシンプルにしています。
6. 本質的な「検証」:データの永続性確認
【 現場の感触 】 最後に、プロセスを終了してもデータが消えないことを確認します。これこそが「データベースを極める」ための第一歩です。
① 再度実行: ./db mydb.db
② データの確認: select と入力
[ 結果 ]
先ほど入れたデータがそのまま表示されれば、「ファイルへのページ書き出し(Persistence)」の仕組みが正常に動いている証拠です。
7. まとめ:やってみて分かったこと
「CREATE TABLEがいらない」のではなく、「最初から1つだけCREATE済みの表がある状態で起動している」という設計。この仕組みを理解することで、DBの心臓部である「ファイルI/O」や「ページ管理」がいかに動いているか、その一端を鮮明に体感することができました。
巨大なRDBMSも、突き詰めればこうした「ファイルの読み書き」の積み重ね。自作してみることで、トラブル時にも「今はディスクと対話中かな?」といった具体的な想像力が働くようになります。