データバージョニング:後戻りできない事態を防ぐために
誰もが一度は経験があるはずです。WHERE句を忘れた不用意なDELETE文がテーブルを空にしてしまい、深夜2時のバックアップを必死にリストアする羽目になる。ソースコードの世界にはGitという救世主がいますが、データベースの世界では通常、「元に戻す」ボタンのない単一の変更可能な状態しかありません。MySQLやPostgreSQLのような伝統的なRDBMSは、現在の状態を扱うのは得意ですが、過去を記憶するのは驚くほど苦手です。
Doltはこの状況を一変させます。これはバージョン管理されたストレージエンジン上に構築されたリレーショナルデータベースです。MySQLとGitの強力な機能を組み合わせたツールだと考えてください。使い慣れたSQL構文を使用して、スキーマのブランチ作成、行のdiff取得、チームメイトからのデータのマージが可能です。
スタックにおけるDoltの立ち位置
データベース選びは常にトレードオフの連続です。Doltを理解するには、日常的に使っているツールと比較してどこに位置するのかを確認する必要があります。
Dolt vs. 標準SQL (MySQL/PostgreSQL)
バニラのMySQLは高速なトランザクションに最適化されており、「今この瞬間」を重視します。DoltはProlly Trees(確率的Bツリー)と呼ばれるストレージエンジンを使用しています。このコンテンツアドレス指定構造により、Doltは膨大なストレージオーバーヘッドなしにデータベースの全履歴を保存できます。MySQLワイヤープロトコルに対応しているため、既存のORMやクライアントからは標準のサーバーのように見えます。
Dolt vs. マイグレーションツール (Liquibase/Flyway)
Flywayのようなツールは*スキーマ*(設計図)のバージョン管理のみを行います。つまり、CREATE TABLEスクリプトを追跡するのです。一方、Doltは**データそのもの**をバージョン管理します。50,000行のCSVをテーブルにインポートした場合、Doltはその全行を追跡します。コードのフィーチャーブランチと同じように、ブランチを作成し、行を変更してマージし直すことができます。
Dolt vs. Git LFS
Git LFSは巨大なバイナリブロブの保管庫です。Git LFS内のCSVは、一度ダウンロードしてローカルインスタンスを立ち上げない限りクエリを実行できません。Doltはライブでクエリ可能なデータベースです。SQLプロンプトを離れることなく、異なるコミットやブランチをまたいで複雑なJOIN操作を実行できます。
現実的なトレードオフ
どんなツールも万能薬ではありません。私は構成管理や機械学習用データセットにDoltを使用していますが、あらゆる本番環境의 ワークロードに常に最適であるとは限りません。
メリット
- リスクゼロの実験: 破壊的なデータマイグレーションをテストするためにブランチを作成します。失敗した場合は、
dolt checkout mainを実行するだけで、何もなかったことになります。 - 監査証跡: すべての変更にコミットハッシュが付与されます。
dolt blameを使用すれば、先週の火曜日の午後3時に、どのスクリプトまたは開発者が特定の行を修正したかを正確に確認できます。 - 即時ステージング: 開発者は本番データセットをローカルにクローンし、自身のブランチで作業して、レビュー用に「データ・プルリクエスト」をプッシュできます。
コスト(デメリット)
- 書き込みレイテンシ: 書き込みのたびにマークルハッシュを計算するため、Doltの書き込み速度は適切に調整された MySQL 8.0 インスタンスよりも約2倍から5倍遅くなります。
- ディスク使用量: 履歴を保存するにはより多くのスペースが必要です。しかし、構造共有のおかげで、1GBのテーブルに1行追加してもサイズが2倍になることはなく、数キロバイト追加されるだけです。
- メンタルモデル: チームはテーブルにおけるマージコンフリクトを理解する必要があります。
price(価格)カラムのコンフリクト解消は、コードのコンフリクトよりも慎重な思考が求められます。
はじめに:最初のバージョン管理データベース
開発用として、DoltをDockerコンテナまたはローカルCLIツールとして実行することをお勧めします。セットアップは2分以内に完了します。
インストール
LinuxまたはmacOSでは、公式のインストールスクリプトを使用します:
sudo curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | sudo bash
動作確認:
dolt version
ハンズオン:サマーセールのシナリオ
Eコマースのカタログを管理していると想像してください。メインの製品リストの整合性を損なうことなく、24時間のセールに合わせて価格を下げる必要があります。
1. リポジトリの初期化
すべてはディレクトリの作成と初期化コマンドから始まります。
mkdir catalog_db && cd catalog_db
dolt init
2. 基盤の構築
テーブルを作成し、いくつかのアイテムを投入します。
dolt sql -q "CREATE TABLE products (id INT PRIMARY KEY, name VARCHAR(50), price DEC(10,2))"
dolt sql -q "INSERT INTO products VALUES (1, 'メカニカルキーボード', 150.00), (2, 'エルゴノミクスマウス', 90.00)"
dolt add .
dolt commit -m "初期在庫データ"
3. 「安全な」ブランチ
セール価格用のサンドボックスを作成します。
dolt checkout -b flash-sale-june
4. 変更の適用とdiff
更新を実行し、その影響をすぐに確認します。
dolt sql -q "UPDATE products SET price = price * 0.7"
dolt diff
出力結果では、古い価格が赤色、新しい30%割引後の価格が緑色で表示されます。テキストファイルに対するgit diffと全く同じように見えます。
5. マージ
マーケティングチームの承認が得られたら、それらの変更をメインに反映させます。
dolt checkout main
dolt merge flash-sale-june
アプリとの接続
CLIを使い続ける必要はありません。サーバーモードを起動しましょう:
dolt sql-server --port 3306
これで、Python、Go、Node.jsのアプリをlocalhost:3306に向けることができます。SQL経由でブランチを切り替えることも可能です:CALL DOLT_CHECKOUT('my-feature-branch');。これは、各テスト実行をクリーンでバージョン管理されたデータのスナップショットから開始したい自動テストにおいて、非常に強力な機能です。
最後に
Doltは、純粋な書き込み速度よりもデータの整合性と共同作業が重要な場合に最適です。バックアップという静的な世界と、混沌としたライブ更新の世界のギャップを埋めてくれます。機能開発のためにデータベースを「ブランチ」できればいいのにと思ったことがあるなら、Doltこそがあなたが待ち望んでいたツールです。

