独自のデータベースシステムを作成する[終了]


65

データベースをより効率的に使用するためには、データベースがどのように機能するかを学ぶ必要があり、私の学習方法はそうすることです。

独自のデータベースシステムを作成したい。私はクエリを使用してファイルを解析する擬似データベースを作成することには言及していません。これは、単にクエリ言語を備えたファイルシステムインターフェイスです。データベースエンジンの実際の構造について話しています。そして、私が念頭に置いているのはリレーショナルでも文書指向でもないので(それが存在する場合は「ノード指向」です)、可能な限り抽象的で高レベルのリソースが必要です。

それでは、どのように作成しますか?どのリソース/チュートリアル/本を読んで理解できますか?

言語は少しでも重要ではありません。理想的には、コードは特定の言語に結び付けられるのではなく、概念を説明するための擬似コードになりますが、何でもかまいません。私はグーグルで問題について何も見つけることができませんでした(私はこのテーマについて非常に文盲であるため、正しい検索を入力していないだけかもしれません)。

そのようなリソースが利用できない場合、クライアントを作成する方法について何かが少なくとも正しい方向への一歩になると思います。


15
代わりにコンパイラを書いてみませんか?それとも、独自のオペレーティングシステムですか?独自のデータベースを書くことに真剣に取り組んでいるのであれば、オープンソースデータベースは1,000種類あります。ソースコードを調べ、いくつかのパッチを提供してください。その後、独自の構築を考え始めます。
ヤンニス

4
大学レベルと大学院レベルのデータベースコースを受講できます。オンラインで多くのオープンソースのコースがあります。また、いくつかの教科書を購入して、暇なときにそれらを勉強することもできます。これにより、いくつかのアイデアと出発点が得られます。歴史と(それはあなたにこれらの機能を実際に実装されているどのように任意のアイデアを与えることはありませんが、想像力の面で)PostgreSQLはまた助けるに関するニュースを読む
rwong

9
I studied open-source DBs, but their codebase is too hugeredisflockdbのようなものが大きすぎて読めない場合、どのように書き込みやデータベースを所有するのかはわかりません。
ヤンニス

10
@YannisRizos公平を期すと、コード(imo)の読み取りは自分で書くよりもはるかに困難です。
AlexWebr

12
@Xananax:カエル(に耳を傾けていないcrystal-reflections.com/stories/story_73.htm)。好きなことをしてください。プロセスを楽しむための目的を持つ必要はありません。

回答:


61

(それが存在する場合、それは「ノード指向」です)

ここで始める。データベースのような複雑なアプリケーションを扱う場合(単純なデータベースでも複雑なアプリケーションです)、ドメインの歴史と適切な用語に精通し、少なくとも非常に高度なアーキテクチャの概念を持っている必要があります。データベースに関するウィキペディアの記事から始めることができます。関連する概念とさまざまなデータベースの種類に関するすべての記事を読んで数日過ごしました。

そして、私が念頭に置いているのは、リレーショナルでもドキュメント指向でもないからです

次に、RelationalまたはNoSQlを選択します。NoSQLを選択する場合、1種類のNoSQLを選択する必要があります。これは非常に重要です。すべての異なるデータベースファミリを説明するアーキテクチャドキュメントは見つかりません。どちらを選ぶかは問題ではなく、1つ選んでそれを使い続けるだけです。

言語は少しでも重要ではありません。

はい(残念ながら)、データベースファミリを選択した後、そのファミリのオープンソースデータベースからコードの調査を開始する必要があるためです。検索対象に関する一般的なガイドラインがいくつかあります。

  • 比較的小さなコードベース、
  • 建築文書または少なくとも開発ブログ、
  • 選択するデータベースは、ファミリーで一般的と考えられているものに近いものでなければなりません。それが高度に専門化されているかどうかを知るのは難しいでしょう。

適切ないくつかの例:

ソースを入手してコンパイルし、いじってみてください。パッチや派手なものを提出する必要はありません。コードを調べて、あちこちで小さな変更を加えるだけで、何が起こるかを確認できます。これはインクリメンタルなプロセスであり、より多くの操作を行うほど、コードが何をするのかを理解しやすくなります。最初に選んだプロジェクトを理解するのが非常に難しいと思われる場合は、次のプロジェクトに進んでください。

@NBが以前の回答で示唆しているように、別の優れたオプションはMySQLのエンジンの構築に集中することです。

コードベースで何か役に立つことができるようになったら、プロジェクトのコミュニティに参加してください。これが、関連する概念に関する詳細なリソースを見つける最も簡単な方法です。

そして最後に、データベースの作業を開始します。最初は、調査してきたコードの非常に縮小されたクローンを作成することができました。オリジナルである必要はなく、かなりの数の素晴らしいプロジェクトがクローンやフォークとして始まりました。

どのリソース/チュートリアル/本を読んで理解できますか?

かなりの本があります:

そして、数百の他に、Google経由で簡単に追跡できる無数の学術論文があります。まず何をしたいかを定義してから、本を検索する必要があります。他のデータベース作成者のコミュニティに参加することは、書籍のリストを絞り込み、おそらく上記よりもはるかに良い提案を得るのにも役立ちます。

幸運を!完了したら、リポジトリへのリンクを含むコメントを期待しています。そして、もし一度もやったことがなければ、2001年に書き始めたコンパイラーをまだ完成させていないことを思い出させるコメントを残してください。


5
これはいい投稿です
チャニ

2
これはすごい!さらにあなたから来る:)私はほとんどお互いの答えを受け入れたいのですが、私は1つを選ばなければならないので、これはそれでなければなりません。I'm expecting a comment with a link to your repository when you're done: 確実に!あなたと他の皆に感謝します、これは本当に高揚しました。
ザナナックス

3
そして、同じ答えを求めてここに来ている人にとっては、flockDBが学ぶのに最適な候補であることがわかります。コードベースは本当に小さく、コードは非常に読みやすく(私はscalaを話せませんが)、理解しやすいです。
ザナナックス

@Yannis、Btwお勧めの本はどれですか。
14

@Xananax Soooどうですか?私たちが見ることができるリポジトリ?:)
ラドゥ・ムルゼア

27

あなたはそれをし、考えすぎないでください。学習プロセスと熱意を楽しむことは贈り物です。

良いアイデアかどうかを他の人に尋ねることは、確かに良い戦略ではありません。すべてのカエルの話を聞いていたとしても、私は今でもイケアで働いていて、ショッピングカートを駐車場から倉庫まで押していました。

Ayendeがその興味深い投稿でしたように、あなたは自分を正当化する必要はありません。問題は:

しかし、実用的な開発者として、CouchDB、MongoDB、Tokyo、Redisなど、かなり成熟した選択肢がある飽和市場で、このプロジェクトが提供する新しい機能について疑問に思っています。これらの製品の多くはクロスプラットフォームであり、実績のあるC速度で動作し、シャーディング機能とフォールトトレランスがはるかに強化されている非常に大きなWebサイトで使用されています。

プロセスに喜びを感じても、目的を気にしないでください。すでに勝ちました。


4
+1、非常に思慮深く、教えて返事:-) ... somehtingをしたい人への本当にいい答え
Pankaj Upadhyay

とてもいいですね。私はこれを受け入れる寸前でした。ヤニスの答えはもっと重要であり、同じ質問をしている人を助ける可能性が高いと思ったからではありませんでした。しかし、これは間違いなく励みになりました。どうもありがとう。
ザナナックス

ヤニスの答えは私のものよりも優れているとあなたの選択に値する

6

「(それが存在する場合、「ノード指向」です)」。-これがあなたがあまり見つけていない理由かもしれません!

バージョン0.1に飛び込み、どこで入手できるかを確認してください。あなたは、あなたが「すべき」ことを尋ねることから、あなたが望むものを生み出そうとすることからもっと学ぶかもしれません。数日待ってから、どこにあるかを確認します。

約18年前、私はbtreeインデックスを使用して基本的なデータベースシステムを作成し(楽しみのために図を参照)、非常に多くのことを学びました。



4

素晴らしいプロジェクトのようですね。どうやらあなたの目標は、本番ソフトウェアを作成することではなく、データベースとデータベースシステムを作成するプロセスについて学ぶことです。

私はあなたが多くの研究をする必要があるとは本当に思わない。目的は、ノードベースのデータベースシステムを作成するために何が行われるかを体験することであるようです。

始め方は次のとおりです。

  1. お気に入りの言語または改善したい言語を選択します。
  2. ノードオブジェクト(または言語で最も近いもの)を作成します。それらをリンクする方法を見つけてください。
  3. 最初に実装するSQLステートメントの短いリストを作成します。
  4. データの保存方法を決定します。1つの明らかな解決策は、すべてのノードをシリアル化し、プログラムの開始時にそれらをロードし、プログラムの終了時にそれらを保存することです。

基本を機能させると、困難な点や問題のある点についてより多くの洞察が得られます。次に、それについていくつかの調査を行い、いくつかの改善点を見つけ、それらを統合できます。


1
あなたが提案した手順に従っています。1,2,3は問題ありません。しかし、私は#4に困惑しています。大量のデータの場合、関連する部分のみをメモリに読み込むにはどうすればよいですか?すべてをバイナリデータとして保存し、別のインデックスファイルを保持することを考えましたが、ユーザーがインデックスでクエリを実行していない場合はどうなりますか?私はまだ全体のファイルをループする必要があります...私はそれが別の質問のための時間だと思う
Xananax

なぜすべてをメモリに保存しないのですか?1 GBを割り当てると、大量のデータが保持されます。または、各バイナリデータノードをディスクに保存すると、テキスト用に1 GBが必要になります。それはたくさんのテキストです。とにかく、1GBを超えるデータベースの処理は演習の中心ではないと思います。
B七つの

また、1 GBのメモリ内で効率的に動作する多くのメソッドを作成できます。システムのその部分を後で改善できます。1つの解決策は、すべてのノード情報をメモリにロードし、各ノードのデータをディスクに保存することです。そうすることで、ノードを効率的にトラバースし、ディスクにアクセスするだけで本当に必要なデータを取得できます。
B七つの

3

「すべてがどのように機能するかを理解するために」独自のデータベースを作成することが、そうする唯一の正当な理由です(データベースは、正しく取得するのが難しく、正しいことを証明するのが難しいため)。あなたはクレイジーですが、良い意味で!

それがどのように行われているのかを見るために、SQLiteを見ることをお勧めします。SQLiteのソースが唯一の圧縮1.3メガバイト程度であり、それは完全にACID準拠のトランザクションデータベースです。それはパブリックドメインでもあり、主な著者はあなたの質問に喜んで答えてくれると確信しているナイスガイです。(;横たわって停止し、実際に取引を書くためにOSやハードウェアを説得私はトリッキーなビットが本当にディスクに情報をコミットする方法で来ると思うNOW驚くほど困難であり、なぜ私はDBを記述する必要はありませんので、うれしいです。)


1
SQLiteのコードベースは0,2 * 10 ^ 6 LOC(5メガバイト解凍)に近づく、そうではありませんように小さいです。
ヤンニス

1
@Yannis:... MySQLやPostgreSQLや他のサーバーのDBシステムのいずれかと比較してください
ドナル・フェローズ


3

データベースの仕組みを学ぶ必要があります

リレーショナル代数を学びます。

小さなDBエンジンを見つけて、ソースを学んでください。

それらをより効率的に使用するために

いや。データベースを効率的に使用する方法を学ぶ必要があります。あなたの車がどのように機能するかを理解していれば、あなたはより良いドライバーになるかもしれませんが、本当に運転に集中するなら、あなたはずっと良いドライバーになるでしょう。

従来のルートを取る:コースを受講し、本を読み、査読し、質問し、インデックスlukeを使用します


5
Learn relational algebra.もちろん、opはリレーショナルデータベースに興味があると仮定します...
yannis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.