1

とりあえず、教育目的で自分のデータベースエンジンを設計したいと思います。バイナリファイル形式を設計することは難しいことでも問題でもありません。私は過去にそれを行いましたが、データベースファイル形式を設計しているときに、非常に重要な質問に出くわしました。

アイテムの削除を処理する方法は?

これまで、次の2つのオプションについて考えてきました。

  • 各アイテムには、削除時に1に設定される「削除済み」ビットがあります。
    • プロ:比較的速い。
    • 短所:機密データがファイルに残る可能性があります。
  • 0x00削除時にアイテム全体を削除します。
    • 長所:機密データの可能性がある場合はファイルから削除されます。
    • 短所:比較的遅い。
  • データベース全体を再作成します。
    • 長所:フォローアップの質問を無効にする空のブロックはありません。
    • 短所:ユーザーがタイプミスを修正したため、 4GBのデータベースファイル全体を上書きすることをお勧めします。この方法をできるだけ早くTwitterに販売します!

ここで、データベースにすでにいくつかの空のブロック(削除されたアイテム)があるとします。フォローアップの質問は、新しいアイテムの挿入をどのように処理するかです。

  • ファイルの最後にアイテムを追加します。
    • プロ:可能な限り最速。
    • 短所:削除されたアイテムが実際に削除されないために残っているすべての空のブロックのために、ファイルは巨大になります。
  • 挿入するブロックとまったく同じサイズの空のブロックを検索します。
    • プロ:いくつかのブロックを取り除く可能性があります。
    • 短所:挿入ごとにファイル全体をスキャンして、完全に適合する空のブロックに遭遇する可能性が非常に低いことがわかる場合があります。
  • 挿入するアイテム以上の最初の空のブロックを見つけます。
    • プロ:途中で空のブロックが見つかるので、ファイル全体をスキャンすることにはならないでしょう。これにより、ファイルサイズが比較的小さく保たれます。
    • 短所:0x00アイテムの最後に、実際よりも大きな空のブロックに挿入されたバイトがまだたくさん残っています。

さて、最初の削除方法と最後の挿入方法はおそらく「最良の」組み合わせだと思いますが、それでも独自の小さな問題があります。または、最初の挿入方法スケジュールされた完全なデータベースの再作成。(非常に大規模なデータベースを操作する場合は、おそらくお勧めできません。また、このメソッドで小さな更新を行うたびに、アイテム全体がファイルの最後に複製されるため、非常識な速度でファイルの拡張が加速されます。)

ファイルシステムで承認された方法でファイルの途中からブロックを削除/挿入する方法がない限り、これを行うための最良の方法は何ですか?さらに重要なことに、現在本番環境で使用されているデータベースは通常、これをどのように処理しますか?

4

3 に答える 3

2

名前を付けるエンジンは非常に異なります...そしてあなたのエンジンはそれらとあまり共通していないようです...あなたのエンジンは古き良きdBaseフォーマットに似ています...

削除するには、ビットを使用したアイデアが適しています...削除されたアイテムを0x00で上書きする部分を構成可能にします...

挿入の場合、それぞれのサイズの空きブロックのリストを保持する必要があります...このリストは、アイテムを削除したとき、ファイルを拡大したとき、およびファイルを縮小したときに更新されます...このようにして、非常に迅速に方法を決定できます挿入を処理します。

于 2012-12-18T22:59:11.230 に答える
1

既存のシステムがどのように機能するかを確認することから始めてみませんか?これがあなた自身の教育のためであるならば、それは長期的にあなたにより多くの利益をもたらすでしょう。

手始めに、実証済みの真のBツリー/ B+ツリーを見てください。次に、フラクタルツリーインデックス、SSTable、ハッシュテーブル、マージテーブルなどの他のいくつかを見てください。

'データベース'がデータを格納およびインデックス付けする方法を理解することから始めます。NoSQLスペースと、より伝統的なRDBMSの世界の両方に、優れたオープンソースと文書化された例があります。存在するものを分解し、理解し、修正し、改善します。

教育目的ではありませんが、私はこの道を進んできました。.NETスペースには、ディスクベースのスレッドセーフなB + Treeがなかったので、私はそれを作成しました。http://csharptest.net/projects/bplustree/で私のブログでそれについてのいくつかを読むか、ソースをダウンロードしてそれを分解することができます:http ://code.google.com/p/csharptest-net/downloads/リスト

于 2012-12-18T23:08:37.720 に答える
1

オープンソースデータベースがありますが、なぜ最初にそれらを見てはいけないのですか。MySQLのソースコードは良いスタートになる可能性があります。ソースをダウンロードして、そこに入ることができます。

また、データベースで使用されているデータ構造の調査を開始してから、永続化戦略などを確認することもできます。

于 2012-12-18T23:12:11.570 に答える