web-dev-qa-db-ja.com

簡単なデータベースエンジンの作成方法

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

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

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

助けてくれて本当にありがとうございます。

136
a_m0d

コードを読むのが得意であれば、SQLiteを学習することで、データベース設計に関するさまざまなことを学ぶことができます。小さいので、頭を包むのが簡単です。しかし、それはまた専門的に書かれています。

http://sqlite.org/

53
Robert Harvey

この質問に対する答えは膨大です。 PHDの論文では100%の回答が得られると期待されています;)

  • データを内部に保存する方法:データベースオブジェクトを含むデータファイルと、フォーカスのあるデータとその周辺のデータをRAM一部のデータでは、列区切り文字と行区切り文字の定義に同意して、このテーブルをバイナリファイルに変換するデータ形式を作成し、そのような区切り文字のパターンがデータ自体で使用されないようにします。たとえば、列を分離するために<*>を選択した場合、このパターンを含まないようにこのテーブルに配置するデータを検証する必要があります。また、行のサイズと内部インデックス番号を指定して行ヘッダーと列ヘッダーを使用することもできます検索を開始し、各列の先頭で「Adam」、1、11.1、「123 ABC Street POBox 456」のようにこの列の長さを設定します<&RowHeader、1> <&Col1、CHR、4 > Adam <&Col2、num、1,0> 1 <&Col3、Num、2,1> 111 <&Col4、CHR、24> 123 ABC Street POBox 456 <&RowTrailer>

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

  • Oracleから知っている挿入データを高速化する方法は、RAMとディスク上の一時的な場所にデータを挿入し、定期的にハウスキーピングを行うことです。データベースエンジンは常に最適化され、構造ですが、そのような何かの停電の場合にデータを失いたくないので、ソートなしでこの一時的な場所にデータを保持し、元のストレージを追加し、後でシステムが無料で再利用するときに完了したら、一時領域をインデックス付けしてクリアします

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

25
A.Rashad

始めるのに適したトピックに関する本があります データベースシステム:完全な本 Garcia-Molina、Ullman、およびWidom

11
djna

SQLiteについては前に言及しましたが、何か付け加えたいと思います。

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

10
Juergen

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

8
a_m0d

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

それは最近の、小さな(ソースコード1MB)、オープンソースです(そのため、自分で理解することができます)...

実装方法についての本が書かれています:

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

これは、デスクトップコンピューターと携帯電話の両方のさまざまなオペレーティングシステムで実行されるため、実験は簡単であり、それについて学ぶことは現在および将来に役立ちます。

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

8
michael aubert

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

7
nightingale2k1

MySQLに興味がある場合は、この wikiページ もお勧めします。これには、MySQLの動作に関する情報が含まれています。また、MySQL Internalsを理解するをご覧ください。

また、データベースエンジンの非SQLインターフェイスを検討することもできます。 Apache CouchDB をご覧ください。あなたが呼ぶもの、ドキュメント指向のデータベースシステム。

幸運を!

3
user59634

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

2
sud03r