シンプルなデータベースエンジンの作成方法[終了]


143

データベースエンジンがどのように機能するか(つまり、内部について)知りたいです。私はCSで教えられている基本的なデータ構造(ツリー、ハッシュテーブル、リストなど)のほとんどを知っているだけでなく、コンパイラの理論をかなり理解しています(そして、非常に単純なインタプリタを実装しています)。データベースエンジンの作成について。このテーマについてチュートリアルを検索しましたが、見つからなかったので、他の誰かが私を正しい方向に向けてくれることを願っています。基本的に、私は以下についての情報をお願いします:

  • データが内部に格納される方法(つまり、テーブルがどのように表されるかなど)
  • エンジンが必要なデータを見つける方法(例:SELECTクエリの実行)
  • 高速かつ効率的な方法でデータを挿入する方法

そして、これに関連するかもしれない他のトピック。ディスク上のデータベースである必要はありません。メモリ内のデータベースでさえ、その背後にあるプリンシパルを学びたいだけなので、(簡単であれば)結構です。

ご協力いただき誠にありがとうございます。

回答:


55

コードを読むのが得意であれば、SQLiteを学ぶことで、データベースの設計に関する多くのことを学ぶことができます。小さいので頭を包みやすいです。しかし、それも専門的に書かれています。

http://sqlite.org/


2
sqliteダウンロードシェルのLOC.c => 3135、sqlite3.c => 136332、sqlite3ext.h => 447、sqlite3.h => 7097、合計=> 147011
Khaja Minhajuddin

1
これはおそらく、中括弧言語を使用して完全に機能するデータベースエンジンを作成できるくらい小さいです。SQLiteはC#でも利用できます。
Robert Harvey


4
SQLite 2.5.0のコードを読むことをお勧めします:github.com/davideuler/SQLite-2.5.0-for-code-reading、それはSQLiteの初期バージョンであり、最新のGCCでコンパイルして実行できます(私はテストしました) MacOS 10.13およびDebian 8の場合)
david euler '17年

1
cstack.github.io/db_tutorialが出発点として適しています。
Ashish Negi

25

この質問への答えは巨大です。PHDの論文が100%回答したと期待してください;)しかし、問題を1つずつ考えることができます。

  • データを内部的に保存する方法:データベースオブジェクトを含むデータファイルと、データをフォーカスするためのキャッシュメカニズムが必要です。その周りの一部のデータは、テーブルがあり、一部のデータがあると想定して、データ形式を作成します。列区切り文字と行区切り文字の定義を一致させることにより、このテーブルをバイナリファイルに変換し、そのような区切り文字のパターンがデータ自体で使用されないようにします。つまり、たとえば列を区切るために<*>を選択した場合は、このパターンを含まないように、このテーブルに配置するデータを検証する必要があります。行のサイズと内部インデックス番号を指定して行ヘッダーと列ヘッダーを使用して検索を高速化し、各列の先頭に「Adam」、1、11.1などのこの列の長さを持たせることもできます。 」

  • ハッシュとインデックスを使用してアイテムをすばやく検索する方法は、上記の同じ例を参考にして、異なる基準に基づいて保存およびキャッシュされたデータをポイントします。最初の列の値をソートし、アルファベット順にソートされたアイテムの行IDをポイントする別のオブジェクトに保存できます、 等々

  • オラクルから知っているデータの挿入を高速化する方法は、RAMとディスクの両方の一時的な場所にデータを挿入し、定期的にハウスキーピングを行うことです。データベースエンジンは常に構造を最適化するためにビジーですが、同時にそのような何かの停電の場合にデータを失いたいです。したがって、並べ替えを行わずにこの一時的な場所にデータを保持し、元のストレージを追加して、後でシステムがインデックスを自由に再利用できるようになり、完了時に一時領域をクリアするようにしてください

幸運、素晴らしいプロジェクト。


11

SQLiteについては前述しましたが、いくつか追加したいと思います。

私は個人的にSQliteを学ぶことで多くを学びました。おもしろいのは、私はソースコードに行かなかったということです(私はちょっと見ていましたが)。私は技術資料を読み、特にそれが生成する内部コマンドを調べることで多くを学びました。内部には独自のスタックベースのインタープリターがあり、explainを使用するだけで内部的に生成されるPコードを読み取ることができます。したがって、さまざまな構成要素がどのように低レベルエンジンに変換されるかがわかります(これは驚くほど単純ですが、それはその安定性と効率の秘密でもあります)。



9

さて、SQLと実装に関するいくつかの情報があるサイトを見つけました-すべてのチュートリアルをリストするページにリンクするのは少し難しいので、それらを1つずつリンクします。


8

www.sqlite.orgに焦点を当てることをお勧めします

これは最近の小さな(ソースコード1MB)オープンソースです(自分で理解できるように)...

本はそれがどのように実装されるかについて書かれました:

http://www.sqlite.org/books.html

デスクトップコンピューターと携帯電話の両方のさまざまなオペレーティングシステムで実行できるので、実験は簡単で、それを学ぶことは現在そして将来的に役立つでしょう。

ここにもまともなコミュニティがあります:https : //stackoverflow.com/questions/tagged/sqlite


1
3.10のバイトサイズは、ソースコードのほぼ7.0 mbになりました。権限を与えられた数人だけが一度にすべてを消化することができました。それでも、ここから始めるのも良いでしょう。
Laurie Stearn、2015

1
確かに。最近、SQLCipherのバグを見つけるためにSQLiteのソースコードの内部に時間を費やしたので、それは絶対的な悪夢です。6年前の生活はよりシンプルでした:-)
マイケル・オーベール

パーティーに間に合わなかったときの簡単な質問ですが、最初のバージョンから始める方がはるかにリラックスできる(そして役に立つかもしれません)でしょうか。実際、私は大きなプロジェクトのすべての真剣なコードの読み取りのためにそうすべきですか?
ニコラスハンフリー

7

HSQLDBから学ぶことができるかもしれません。学習用に小さくシンプルなデータベースを提供していると思います。オープンソースなので、コードを見ることができます。


3

それがあなたの要件に合うかどうかはわかりませんが、SELECT, INSERT , UPDATEperlを使用したシンプルな()をサポートするシンプルなファイル指向データベースを実装しました。
私が行ったのは、各テーブルをディスク上のファイルとエントリとして明確に定義されたパターンで保存し、awkやsedなどの組み込みLinuxツールを使用してデータを操作したことです。効率を上げるために、頻繁にアクセスされるデータはキャッシュされました。


1
あなたはまだ、コードを持っていますuがリンクを共有することができます
GK1

3

MySQLに興味がある場合は、MySQLの動作に関する情報を得たこのWikiページもお勧めします。また、MySQLの内部についてを参照することもできます

データベースエンジンの非SQLインターフェースを確認することも検討してください。Apache CouchDBをご覧ください。これは、ドキュメント指向のデータベースシステムです。

幸運を!


ANd別のdb:sqlserverinternals.comを確認したい場合は、SQlサーバー内部の彼女のnbookがトップニッチです。
HLGEM 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.