忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【db.c】MacとC言語でデータベースをゼロからビルドしてみた完全実録


データベースの内部構造を理解するために、SQLiteの構造をモデルにした「db.c」をMac(Apple Silicon)環境で動かしてみました。環境構築から、誰もが抱く「あの疑問」の解決まで、省略なしの全行程を記録します。

1. 開発環境の準備:Xcode Command Line Tools

【 現場の感触 】 MacでC言語をコンパイルするには、Apple純正のコンパイラ(Clang)が必要です。まずはターミナルから、開発の「儀式」とも言えるツールのインストールから始めます。

# ターミナル(Terminal.app)を起動し、以下を入力
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でビルド。-o は出力ファイル名の指定。
clang db.c -o db

# 実行ファイルができたか確認(lsコマンド)
ls -F
→ db* と表示されれば準備完了です。

4. データベースの起動と操作(実践)

【 現場の感触 】 実際にプログラムを動かし、データを入力してみます。ここで驚くのが、「CREATE TABLE」を一度も叩かずに insert ができてしまうことです。

# 起動。引数にデータベースファイル名(mydb.db)を指定。
./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も、突き詰めればこうした「ファイルの読み書き」の積み重ね。自作してみることで、トラブル時にも「今はディスクと対話中かな?」といった具体的な想像力が働くようになります。


PR