Якщо ваша база даних невелика, ви можете використовувати файлову систему. Перевага такого підходу полягає в тому, що він дуже низькотехнологічний і буде працювати всюди з дуже невеликим кодом. Якщо ключі складаються з символів для друку і не містять їх /
, ви можете використовувати їх як імена файлів:
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"
}
Зауважте, що реалізація іграшок вище - це не вся історія: вони не мають жодної корисної трансакційної властивості, наприклад, атомність. Основні операції з файловою системою, такі як створення та перейменування файлів, є атомними, і можливо створити атомні версії функцій вище.
Ці реалізації прямої файлової системи підходять для типових файлових систем лише для невеликих баз даних, до кількох тисяч файлів. Крім цього, більшість файлових систем важко справляється з великими каталогами. Можна адаптувати схему до більших баз даних, використовуючи шаруватий макет. Наприклад, замість того, щоб зберігати всі файли в одному каталозі, зберігайте їх в окремих підкаталогах на основі перших кількох символів їх імен. Так робить, наприклад, git : його об'єкти, індексовані хешами SHA-1, зберігаються у файлах, що називаються .git/objects/01/2345679abcdef0123456789abcdef01234567
. Іншими прикладами програм, які використовують семантичне шарування, є веб-проксі-кешування Wwwoffle та polipo ; обидва зберігають кешовану копію сторінки, знайденої за URL-адресою у файлі, який називаєтьсяwww.example.com/HASH
де HASH - це кодування деякого хешу URL.¹
Іншим джерелом неефективності є те, що більшість файлових систем витрачають багато місця під час зберігання невеликих файлів - витрачається до 2 КБ на файл на типових файлових системах, незалежно від розміру файлу.
Якщо ви вирішили користуватися реальною базою даних, вам не потрібно відмовлятися від зручності доступу до прозорої файлової системи. Існує декілька файлових систем FUSE для доступу до баз даних, включаючи Берклі DB (з dbfs Джеффа Гарзіка ), Oracle (з DBFS Oracle ), MySQL (з mysqlfs ) тощо.
¹
для такої URL-адреси, як http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix
Polipo використовує файл unix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==
із доданим заголовком всередині файлу, який чітко вказує фактичну URL-адресу; ім'я файлу - базове64, що кодує хеш MD5 (у двійковій формі) URL-адреси. Wwwoffle використовує файл http/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw
; ім'я файлу - це домашнє кодування хеша MD5, а супровідний файл http/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhw
містить URL.