PHPfilesDataStorage. NoSQL-база данных на файлах

Позавчера пришла в голову идея написать для phpMyEngine файловый вариант хранения данных.
Ведь не всегда нужна большая БД (Mongo например), особенно на сайтах-визитках с 3-10 страницами.
В итоге родился отдельный продукт <filesDataStorage>, чем-то напоминающий MongoDB :)

Страничка на GitHub — github.com/xmcdbx/filesDataStorage

Под катом самое интересное :)

Создание хранилища данных

Для начала создадим директорию, в которой будут храниться наши данные, например /home/user/data/
теперь создадим в /home/user/app/ файл index.php — наше приложение и «подключимся» к базе данных.

    <?php
    include 'filesDataStorage.php';
    $folder = '/home/user/data';
    $filesDS = new filesDataStorage\DataStorage($folder);
  


Запросы

Существует три вида запросов к базе данных:
get — получение данных
save — сохранение данных
remove — удаление данных

Рассмотрим каждый из них подробнее:

  get ($collection, $data, $limit = 0, $offset = 0, $order = 0, $orderBy = '_id')
  

Описания принимаемых параметров:
$collection — По образу и подобию MongoDB, данные храняться в коллекциях, что позволяет логически их разделять
$data — массив с данными
$limit — лимит на выборку
$offset — отступ
$order — тип сортировки, числовой параметр, 1 — DESC, -1 — ASC и 2 — RAND
$orderBy — поле, по которому будет осуществлена сортировка



  save ($collection, $data)
  remove ($collection, $data)
  

С этими функциями думаю всё ясно и без объяснений ;)

Данные
Как мы выяснили в прошлом разделе — данные передаются массивом, и так, по-пробуем создать нашу первую запись.
Вернёмся к index.php

    $data = array (
        "_id" => \uniqid(),
        "helloTo" => "world",
        "helloFrom" => array (
            "name" => "Denis",
            "nickname" => "xmcdbx",
            "surname" => "Safronov"
        ),
	"justDigital" => 3
    );

каждая запись обязательно должна иметь уникальное свойство _id.
Теперь сохраним данные в базу.

$collection = 'topsecret';
$filesDS->save($collection,$data);


Выборки
Для начала сохраним то, что будем потом искать :)

<?php
namespace filesDataStorageExample;

$folder = __DIR__ . '/data';
$collection = 'example';

include './filesDataStorage.php';
$filesDS = new \filesDataStorage\DataStorage ( $folder );

class Hello {
    public $to, $from;
}

$hello = new Hello();
$hello->to = 'world';
$hello->from = 'xmcdbx';

$data = array ();
$data['_id'] = \uniqid();
$data['hello'] = $hello;

$filesDS->save ( $collection, $data );


А теперь попробуем найти все приветствия миру

namespace filesDataStorageExample;

$folder = __DIR__ . '/data';
$collection = 'example';

include './filesDataStorage.php';
$filesDS = new \filesDataStorage\DataStorage ( $folder );

$filter = array ();
$filter['hello']['to'] = 'world';

$result = $filesDS->get ( $collection, $filter );

в результате мы получим:
array
0 =>
array
'_id' => string '4cc67321351e0' (length=13)
'hello' =>
array
'to' => string 'world' (length=5)
'from' => string 'xmcdbx' (length=6)


Продвинутые выборки

Но, что делать, если нужно сделать более сложную выборку? Ответ очевиден — делать :)
Для данных существует 9 операций сравнения:
  1. $gt — больше

  2. $lt — меньше

  3. $gte — больше или равно

  4. $lte — меньше или равно

  5. $ne — не равно

  6. $btw — в интервале

  7. $in — содержится в массиве значений

  8. $nin — не содержится в массиве значений

  9. $all — массив-значение, должно полностью содержаться в значения поля




Примеры использования:

$filter['field'] = array('$gt'=>4);



$filter['justDigital'] = array('$btw'=>array(6,11));



$filter['justDigital'] = array('$in'=>array(6,11,4,7));


Сортировка значений, лимитирование выборки
Рассмотрим такой пример:


$filter = array ();
$filter['justDigital'] = array ('$nin' => array (6, 11, 4, 7));
$order = 2; //RAND
$orderBy = 'justDigital';
$limit = 4;
$offset = 2;
$result = $filesDS->get ( $collection, $filter, $limit, $offset, $order, $orderBy );


Здесь мы выбираем 4 случайных значения, начиная со второго сдвига.
$order может принимать следующие значения:
  • -1 — по убыванию,

  • 1 — по возрастанию,

  • 2 — в случайном порядке.




Так же можно осуществлять сортировку по значению внутри «объекта»:

$orderBy = 'hello.to';

где hello — имя объекта, to -поле объекта.

На сегодня всё :)

В следуюшей статье приведу результаты тестирование производительности в сравнении с textSQL,YNDb и возможно другими файловыми БД.

P.S. И ещё раз напоминаю, данное решение ни в коем случае не является единственным правильным. Применение «filesDataStorage» оправдано на shared-хостингах,
где нет возможности использовать Redis,MongoDB либо другие NoSQL-решения.
  • +5
  • xmcdbx
  • 26 октября 2010, 12:33

Комментарии (3)

  • avatar
  • h31
  • 26 октября 2010, 19:40
  • #
  • 0
>на файлах
SQLite?
NoSQLite тогда уже :))))
+ это на нативном php 5.3 и не требует дополнительного софта на сервере
Интересная задумка. Обязательно посмотрю на нее в действии.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.