科学・技術
ExplainDB: 理解しやすさを追求したデータベースシステム
ExplainDB: A Database System Built for Understandability (github.com)
要約
ExplainDBは、データベースシステムの教育を目的として開発された、理解しやすさを重視したデータベースシステムです。Pythonで実装された教育用DBMSとJupyter Notebookのコレクションで構成されており、データベースの概念を段階的に学習できるようになっています。ブラウザ上で簡単に試せる環境も提供されています。
全文翻訳
ExplainDB - 理解しやすさを追求したデータベースシステム
データベースシステムコースの教材: Jupyter NotebookのコレクションとPythonで実装された教育用DBMS(システム/パッケージ)です。このコードを使用した講義はYouTubeで視聴可能です: Database Systems 2024/25 (Prof. Dr. Jens Dittrich, Big Data Analytics Group, Saarland University)。
ブラウザで試す
バッジをクリックすると、インストール不要でmybinder.org上のJupyterLabでNotebookを開くことができます。初回起動、リポジトリ変更後、または長時間の停止後には、Binderが環境を構築するため数分かかることがあります。セッションは一時的で、非アクティブ状態が続くと、または最長数時間後に終了し、すべての変更は失われます。保持したいNotebookはダウンロードしてください(File → Download)。mybinder.orgは無料の公開サービスです。個人情報や機密データをアップロードしたり、Binderセッションでパスワードを入力したりしないでください。
Notebooks
Notebookはチュートリアルの章ごとにグループ化されており、各トピックを説明し、それを実装するコードを示しています。起動バッジはBinderでNotebookを直接開きます。
ストレージとデータレイアウト
Notebook | トピック | 起動
---|---|---
Data-Layout | 行 vs. 列レイアウト: 各レイアウトが異なるクエリに対してどれだけ読み込む必要があるか | [起動]
RAID-Nesting-Trade-offs | RAID 0配列のネストとそのシーケンシャル読み取りパフォーマンスへの影響 | [起動]
インデックス
Notebook | トピック | 起動
---|---|---
B-tree | B+ツリーをステップバイステップで構築、分割とリーフチェーンの可視化付き | [起動]
Bitmaps-and-Bloom-Filters | ビットマップインデックス、その圧縮(WAH)、および高速な「値が存在するか?」チェックのためのブルームフィルター | [起動]
Bit-Sequences-in-Pandas | Pandasのブールマスクをビットシーケンスとして使用: 行のフィルタリングとマスクのAND結合 | [起動]
Christmas-Tree | ラディックストライとディスクリプタートライ、バッファリングおよび「クリスタルボール」バリアント付き | [起動]
Recursive-Model-Index | ソート済みデータを検索するための学習済みインデックス(RMI) | [起動]
クエリ処理
Notebook | トピック | 起動
---|---|---
Result-DB | 2つの結合を持つクエリをオペレーターのパイプラインとして実行(プッシュモデル) | [起動]
CodeGen | Result-DBクエリのPythonコードを生成して実行 | [起動]
Shared-Scan | 複数の同時クエリがデータの一回のスキャンを共有 | [起動]
External-Merge-Sort | メインメモリより大きいデータをソート: チャンクをソートし、マージする | [起動]
Top-k | すべての行をソートせずに ORDER BY title LIMIT 10 を実行 | [起動]
Online-Aggregation | スキャンが完了する前に集計の実行中の推定値を取得 | [起動]
クエリ最適化
Notebook | トピック | 起動
---|---|---
PlanEnumeration | 結合順序列挙アルゴリズム(DPsize、DPsub、DPccp) | [起動]
Distributed-Joins | 複数のノードにまたがる結合の実行 | [起動]
多次元
Notebook | トピック | 起動
---|---|---
Z-Order-Curve | 局所性を維持しながら2Dデータを1DにマッピングするZコード(モートンコード) | [起動]
システム内部
/system/パッケージ
読み込み用に構築された小さなDBMSで、速度は重視していません。/system/interfaces/のインターフェースが契約を運び、他のフォルダがそれを実装しています。
ストレージ (storage/): DRAM、キャッシュ、SSD、ディスクのストレージ階層と、信頼性およびパフォーマンスコストモデルを持つRAIDブロック割り当て(RAID 0/1/4/5)。
インデックス (indexes/): B+ツリー、ビットマップインデックス(等価および範囲エンコード)、ブルームフィルター、ラディックストライ、および「クリスマスツリー」(ノードバッファ付きラディックストライ)。
ビットシーケンス (bit_sequences.py): ビットマップインデックスで使用されるプレーンおよびWAH圧縮ビットシーケンス。
トランザクションストア (stores/): バージョン管理されたキーバリューストアとMVCC(マルチバージョン同時実行制御)、ジャーナリング付き、インデックス付き。
クエリ処理 (query_processing/): スキャン、フィルター、ハッシュ結合、セミ結合、カウントなどのオペレーター、およびWHERE句述語。
ソートとキュー (sorting.py, queues/): インメモリおよびディスクバックのキューを備えた外部マージソート。
クエリ最適化 (query_optimization/): 結合グラフ(チェーン、スター、サイクル、クリップ)、カーディナリティ推定、C_outコスト関数、および動的プログラミング結合順序付けのためのプランテーブル。
DBMS.py はこれらの部分をまとめます。ストア、準備済みクエリ、クエリ最適化を管理します。これらすべての単体テストは/system/tests/にあります。
uvを使用した環境設定
このリポジトリはuvを使用してPythonバージョンと依存関係を管理します。uvは正しいPythonインタープリターをインストールするため、別途Pythonをインストールする必要はありません。
1. uvのインストール
macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh
Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
代替手段(Homebrew、pipxなど)については、uvのインストールドキュメントを参照してください。
2. リポジトリのクローン
git clone https://github.com/explaindb/explaindb.git
cd explaindb
3. 依存関係のインストール
uv sync
これにより、.venv/に仮想環境が作成され、必要に応じてPython 3.12がインストールされ、uv.lockからすべての必要なパッケージがインストールされます。
4. Jupyter Notebookの実行
uv run jupyter notebook
これにより、現在のディレクトリのファイル一覧が表示されるブラウザウィンドウが開きます。Notebookは/notebooks/ディレクトリにあり、そこから開きます。プロジェクト環境内の任意のコマンドは、uv runを前に付けて実行できます — 手動での環境アクティベーションは不要です。または、PyCharmのようなIDEでNotebookを実行することもできます。その場合、IDEのインタープリターをuvによって作成された.venv/にポイントしてください。
テストの実行
uv run python -m unittest discover system/tests/
APIドキュメント
ソースdocstringから生成されたAPIドキュメントは、https://bigdata.uni-saarland.de/software/explaindb/index.html でオンラインで利用できます。ローカルでビルドする方法はCONTRIBUTING.mdに記載されています。
貢献
コードフォーマット、docstring規約、依存関係、Notebook、APIドキュメントのメンテナンス方法については、CONTRIBUTING.mdを参照してください。
ライセンス
ExplainDBはGNU Affero General Public License v3.0 (AGPL-3.0) の下でライセンスされています。Copyright (C) 2026 Prof. Dr. Jens Dittrich, Saarland University。
貢献者
コミット数順:
Jens Dittrich
Marcel Maltry
Simon Rink
Luca Gretscher
Joris Nix
AnthropicのAIコーディングアシスタントClaudeの助けを借りており、コミットで共同著者としてクレジットされています。