1

私は DBMS (基本的には SQL クエリを処理するソフトウェア) を厳密に楽しみと学習体験として作成しています。そして、値と行を分離する最良の方法を知る必要があります。

テーブルの構成には、情報を格納するのに適した XML を使用します。ただし、すべての xml タグが多くのメモリを占有するため、挿入されたすべての行でこれを行うことはできません。また、データベースを表すすべてのオブジェクトをシリアル化して (Java を使用しているため) データを格納することも考えましたが、それも大量のメモリを消費すると思います。

したがって、私が考えることができる唯一のことは、値の区切り記号と行の区切り記号を使用して、最小限のメモリを占有することでした。セパレーターを単一文字として使用する場合の問題 (複数文字を使用する場合は XML を使用することもできます) は、そのセパレーターが値の 1 つにある場合に問題が発生することです。そこで、記号を付けない 16 進数の文字を使用できないかと考えました。それは存在しますか?もしそうなら、それは良いアプローチですか?1 つの問題は、将来、BLOB を許可するようになった場合です。それらにはバイナリデータが含まれており、値の区切り記号が含まれている可能性があります。これに対する最善の解決策は何ですか?

あなたの考えを教えてください!私は議論のために開いています。また、MySQL (またはその他の広く使用されている SQL エンジン) がどのようにデータを保存するかを知っている人がいれば、興味深いかもしれません。

私が得た新しい考え

検索対象/順序に基づいて、さまざまなコンパレータがロードされた TreeSet にテーブル全体を読み込むことができるとしたらどうでしょう。そうすれば、検索は何を検索しても同じように高速になります。もちろん、これの欠点は、ファイル全体を TreeSet に配置されるオブジェクトに書き込む必要があり、大量の RAM になる可能性があることです。どう思いますか?

4

1 に答える 1

3

最初に頭に浮かんだのはインデックスです。DBMS の開発を続けると、さまざまな種類のインデックス (バイナリ ツリー、ハッシュ マップなど) が必要になることがあります。インデックスが有効になるには、内容を直接マッピングする必要があります。ファイルの行を順次スキャンすることはできません。

  • 行が固定長の場合 (テーブル データ定義によって異なります)、レコード間および列間でオフセットを固定することができます。

  • レコードの長さが異なる場合は、固定長の列を上記と同じ方法で処理できます。動的にサイズ変更可能なフィールドの場合、動的にサイズ変更された値を含む、ファイル内の別のセクションへの固定サイズの参照 (オフセット値) が存在する可能性があります。ファイルにはおそらくヘッダーがあるため、ゼロ参照は NULL として扱われる可能性があります。

  • もう 1 つのオプションは、おそらく 2^N の粒度 (ページング) で、行データへの個々のオフセットで行インデックスを維持することです。オフセットは、特にファイルをメモリにマップする場合は、実際のデータの配置と一致する必要があります。開始するには、そのインデックスは、おそらく別のファイルにある、バイナリ検索用の単純な順序付きリストである可能性があります。ただし、これには、あなたが述べたように、いくつかの列区切り文字が必要になります。実際のフィールドの内容の特別な処理 (エスケープなど) を必要としないため、一種のフィールド長エンコーディングを使用します。そのインデックスによってマップされるか、直接埋め込まれた別の構造でフィールド長を維持することはおそらく効果的です (動的列の数が固定されているため)。負のフィールド長は、NULL 値を指定することもできます。

  • 非常にコンパクトなストレージ レイアウトを備えているため、アイデアを得るために sqlite の実装を調べることができます。

于 2013-11-07T18:42:01.093 に答える