PHP → filesDataStorage. NoSQL-база данных на файлах
Позавчера пришла в голову идея написать для phpMyEngine файловый вариант хранения данных.
Ведь не всегда нужна большая БД (Mongo например), особенно на сайтах-визитках с 3-10 страницами.
В итоге родился отдельный продукт <filesDataStorage>, чем-то напоминающий MongoDB :)
Страничка на GitHub —github.com/xmcdbx/filesDataStorage
Под катом самое интересное :)
Создание хранилища данных
Для начала создадим директорию, в которой будут храниться наши данные, например /home/user/data/
теперь создадим в /home/user/app/ файл index.php — наше приложение и «подключимся» к базе данных.
Запросы
Существует три вида запросов к базе данных:
get — получение данных
save — сохранение данных
remove — удаление данных
Рассмотрим каждый из них подробнее:
Описания принимаемых параметров:
С этими функциями думаю всё ясно и без объяснений ;)
Данные
Как мы выяснили в прошлом разделе — данные передаются массивом, и так, по-пробуем создать нашу первую запись.
Вернёмся к index.php
каждая запись обязательно должна иметь уникальное свойство _id.
Теперь сохраним данные в базу.
Выборки
Для начала сохраним то, что будем потом искать :)
А теперь попробуем найти все приветствия миру
в результате мы получим:
Продвинутые выборки
Но, что делать, если нужно сделать более сложную выборку? Ответ очевиден — делать :)
Для данных существует 9 операций сравнения:
Примеры использования:
Сортировка значений, лимитирование выборки
Рассмотрим такой пример:
Здесь мы выбираем 4 случайных значения, начиная со второго сдвига.
$order может принимать следующие значения:
Так же можно осуществлять сортировку по значению внутри «объекта»:
где hello — имя объекта, to -поле объекта.
На сегодня всё :)
В следуюшей статье приведу результаты тестирование производительности в сравнении с textSQL,YNDb и возможно другими файловыми БД.
P.S. И ещё раз напоминаю, данное решение ни в коем случае не является единственным правильным. Применение «filesDataStorage» оправдано на shared-хостингах,
где нет возможности использовать Redis,MongoDB либо другие NoSQL-решения.
Ведь не всегда нужна большая БД (Mongo например), особенно на сайтах-визитках с 3-10 страницами.
В итоге родился отдельный продукт <filesDataStorage>, чем-то напоминающий MongoDB :)
Страничка на GitHub —
Под катом самое интересное :)
Создание хранилища данных
Для начала создадим директорию, в которой будут храниться наши данные, например /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 операций сравнения:
- $gt — больше
- $lt — меньше
- $gte — больше или равно
- $lte — меньше или равно
- $ne — не равно
- $btw — в интервале
- $in — содержится в массиве значений
- $nin — не содержится в массиве значений
- $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
SQLite?
+ это на нативном php 5.3 и не требует дополнительного софта на сервере