とりあえず、教育目的で自分のデータベースエンジンを設計したいと思います。バイナリファイル形式を設計することは難しいことでも問題でもありません。私は過去にそれを行いましたが、データベースファイル形式を設計しているときに、非常に重要な質問に出くわしました。
アイテムの削除を処理する方法は?
これまで、次の2つのオプションについて考えてきました。
- 各アイテムには、削除時に1に設定される「削除済み」ビットがあります。
- プロ:比較的速い。
- 短所:機密データがファイルに残る可能性があります。
0x00
削除時にアイテム全体を削除します。- 長所:機密データの可能性がある場合はファイルから削除されます。
- 短所:比較的遅い。
- データベース全体を再作成します。
- 長所:フォローアップの質問を無効にする空のブロックはありません。
- 短所:ユーザーがタイプミスを修正したため、 4GBのデータベースファイル全体を上書きすることをお勧めします。この方法をできるだけ早くTwitterに販売します!
ここで、データベースにすでにいくつかの空のブロック(削除されたアイテム)があるとします。フォローアップの質問は、新しいアイテムの挿入をどのように処理するかです。
- ファイルの最後にアイテムを追加します。
- プロ:可能な限り最速。
- 短所:削除されたアイテムが実際に削除されないために残っているすべての空のブロックのために、ファイルは巨大になります。
- 挿入するブロックとまったく同じサイズの空のブロックを検索します。
- プロ:いくつかのブロックを取り除く可能性があります。
- 短所:挿入ごとにファイル全体をスキャンして、完全に適合する空のブロックに遭遇する可能性が非常に低いことがわかる場合があります。
- 挿入するアイテム以上の最初の空のブロックを見つけます。
- プロ:途中で空のブロックが見つかるので、ファイル全体をスキャンすることにはならないでしょう。これにより、ファイルサイズが比較的小さく保たれます。
- 短所:
0x00
アイテムの最後に、実際よりも大きな空のブロックに挿入されたバイトがまだたくさん残っています。
さて、最初の削除方法と最後の挿入方法はおそらく「最良の」組み合わせだと思いますが、それでも独自の小さな問題があります。または、最初の挿入方法とスケジュールされた完全なデータベースの再作成。(非常に大規模なデータベースを操作する場合は、おそらくお勧めできません。また、このメソッドで小さな更新を行うたびに、アイテム全体がファイルの最後に複製されるため、非常識な速度でファイルの拡張が加速されます。)
ファイルシステムで承認された方法でファイルの途中からブロックを削除/挿入する方法がない限り、これを行うための最良の方法は何ですか?さらに重要なことに、現在本番環境で使用されているデータベースは通常、これをどのように処理しますか?