データベースが十分に小さい場合は、ファイルシステムを使用できます。このアプローチの利点は、非常にローテクであり、非常に少ないコードでどこでも動作することです。キーが印刷可能な文字で構成され/
、を含まない場合、それらをファイル名として使用できます。
put () { key=$1; value=$2; printf %s "$value" >"datastore.db/$key"; }
get () { key=$1; cat "datastore.db/$key"; }
remove () { key=$1; rm "datastore.db/$key"; }
任意のキーに対応するには、キーのチェックサムをファイル名として使用し、オプションでキーのコピーを保存します(キーを一覧表示できない、または特定のエントリのキーが何であるかわからない場合を除く)。
put () {
key=$1; value=$2; set $(printf %s "$key" | sha1sum); sum=$1
printf %s "$key" >"datastore.db/$sum.key"
printf %s "$value" >"datastore.db/$sum.value"
}
get () {
key=$1; set $(printf %s "$key" | sha1sum); sum=$1
cat "datastore.db/$1.value"
}
remove () {
key=$1; set $(printf %s "$key" | sha1sum); sum=$1
rm "datastore.db/$1.key" "datastore.db/$1.value"
}
上記のおもちゃの実装はすべてではありません。原子性などの有用なトランザクションプロパティはありません。ただし、ファイルの作成や名前の変更などの基本的なファイルシステム操作はアトミックであり、上記の関数のアトミックバージョンを構築することは可能です。
これらのファイルシステムへの直接実装は、最大数千ファイルの小さなデータベースにのみ一般的なファイルシステムに適しています。この点を超えて、ほとんどのファイルシステムは大きなディレクトリに対処するのに苦労しています。階層化されたレイアウトを使用して、スキームをより大きなデータベースに適合させることができます。たとえば、すべてのファイルを1つのディレクトリに保存するのではなく、名前の最初の数文字に基づいて別々のサブディレクトリに保存します。これはgitが行うことです。たとえば、SHA-1ハッシュでインデックス付けされたオブジェクトは、というファイルに保存されます.git/objects/01/2345679abcdef0123456789abcdef01234567
。セマンティックレイヤーを使用するプログラムの他の例は、WebキャッシングプロキシWwwoffleとpolipoです。どちらも、URLで見つかったページのキャッシュコピーをというファイルに保存しますwww.example.com/HASH
HASHはURLのハッシュのエンコードです。¹
非効率性の別の原因は、ほとんどのファイルシステムが小さなファイルを保存するときに多くのスペースを浪費することです。ファイルのサイズに関係なく、一般的なファイルシステムではファイルごとに最大2kBの無駄があります。
実際のデータベースを使用することを選択した場合、透過的なファイルシステムアクセスの利便性を放棄する必要はありません。Berkeley DB(Jeff Garzikのdbfsを使用)、Oracle(Oracle DBFSを使用)、MySQL(mysqlfsを使用)などを含むデータベースにアクセスするためのFUSEファイルシステムがいくつかあります。
¹の
ようなURLの場合http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix
、Polipoはファイルを使用します。ファイルunix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==
内にヘッダーが追加され、実際のURLがクリアテキストで示されます。ファイル名は、URLのMD5ハッシュ(バイナリ)のbase64エンコードです。Wwwoffleはファイルを使用しますhttp/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw
。ファイルの名前はMD5ハッシュの自家製のエンコーディングであり、コンパニオンファイルhttp/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhw
にはURLが含まれています。