При разработке web приложений, часто возникает потребность в хранении определённых настроек или временных данных. Обычно, для этого используются или файлы, или базы данных. Если это база данных, то хранить в базе таблицу с одной строкой, как чаще всего это бывает, не очень удачный вариант. Для этого чаще используются config файлы определенных форматов (*.php, *.ini, *.xml, *.json).

JSON база данных

В данном посте я хочу рассказать об использовании json файлов как базы данных. Использование именно формата json удобно тем, что информация в данном формате — это Javascript массивы и объекты, к которым легко можно получить доступ с клиентской части web приложения.

Любая база данных включает в себя набор функций для записи, чтения, обновления и удаления данных из таблиц. В данном случае это будет класс с набором методов для управления базой.

$jdb  = new Jsondb($path);

$path — путь от корня до папки, в которой будут храниться файлы. По умолчанию $path = $_SERVER[«DOCUMENT_ROOT»].‘/jdb/’.

Управление базой данных

Ниже представлен набор методов и примеров их использования.

Create

Создание таблицы.

$jdb->create($table, $keys);

$keys — массив ключей таблицы и их характеристик. Поддерживается auto_increment и default.

Пример:

$keys = Array(
    'id'=>Array('auto_increment'),
    'title'=>Array('default'=>'itsacru'), 
    'posts', 
            'userId'
);
$jdb->create('itsac', $keys);

Select

Выборка данных из таблицы.

$jdb->select($select, $table, $rules);

$select — массив или строка, содержащие ключи для выборки.

$table — название таблицы из которой будет происходить выборка данных.

$rules — массив, содержащий параметры where, order и limit.

Пример:

$rules = Array(
        'where'=>Array(
                'id'=>Array(1,2,3,4,6,7,10),
                'name'=>'itsac'
            ),
        'order'=>Array('id','desc'),
        'limit'=>5
    );
$jdb->select('*','itsac',$rules);
$rules = Array(
        'order'=>Array('rand()'),
        'limit'=>Array(10,4)
    );
$select = Array('id','title','userId'); # все равно, что $select ='id,title, userId';
$jdb->select($select, 'itsac', $rules);

Insert

Вставка данных в таблицу.

$fdb->Insert($table, $data);

$data — ассоциативный массив данных для вставки в таблицу.

Пример:

$data = Array('title'=>'new title', 'userId'=>6431);
$jdb->insert('itsac', $data);

Update

Обновление данных в таблице.

$jdb->update($table, $data, $where);

$table — название таблицы.

$data — ассоциативный массив с данными для обновления.

$where — ассоциативный массив с данными для выбора нужной записи для обновления.

Пример:

$data = Array('title'=>'updated title');
$where = Array('title'=>'new title', 'userId'=>6431);
$jdb->update('itsac', $data, $where);

Delete

Удаление записей из таблицы.

$jdb->delete($table, $where);

$table — название таблицы.

$where — ассоциативный массив данных для выборки нужной записи для удаления.

Пример:

$where = Array('userId'=>6431);
$jdb->delete('itsac', $where);

Drop

Удаление таблицы.

$jdb->drop($table);

Пример:

$jdb->drop('itsac');

Alter 

Добавление и удаление ключей из таблицы.

$jdb->alter($table, $todo, $keys);

$table — название таблицы.

$todo — выполняемое действие. Может быть add или drop.

$keys — строка или ассоциативный массив данных для удаления или добавления ключей.

Пример:

$jdb->alter('itsac', 'drop', 'title','userId');

$keys = Array(
                'postTitle'=>Array(
            'default'=>'itsacpost'
        )
);
$jdb->alter('itsac', 'add', $keys);
$keys = Array('acc','userId'); # все равно, что $keys = 'acc, userId';
$jdb->alter('itsac', 'add', $keys);

Truncate

Полностью очистить таблицу.

$jdb->truncate($table);

$table — название таблицы.

Exists

Проверяет существование таблицы.

$jdb->exists($table);

$table — название таблицы.

Определение ошибок в запросах

Все перечисленные методы возвращают результат запроса, если он был удачен, и false если нет. Метод “status”; позволяет узнать статус предыдущего запроса.

$jdb->status($flag);

$flag — по умолчанию false. Если установлено true, то будет возвращено текстовое сообщение с ошибкой вместо статус-кода.

Пример:

$jdb->create('users',Array('id'=>Array('auto_increment'),'name'));
$jdb->create('users',Array('id','name'));
echo $jdb->status();
echo $jdb->status(true);
/*
 *  101
 *  Table already exists;
 */
$jdb->select('phone', 'users');
echo $jdb->status();
echo $jdb->status(true);
/*
 *  202
 *  Try ro select an unexisting keys from table "users";
 */

Список статус-кодов:

  • 0 — All ok.
  • 101 — Table already exists.
  • 102 — Table doent exist.
  • 103 — Unkonw property.
  • 201 — Key already exist.
  • 202 — Keys doesnt exsit.

Вспомогательные методы

Last_insert_id

Часто бывает, что нужно узнать id добавленной записи в базу данных. Для этого нужно воспользоваться методом last_insert_id.

$jdb->last_insert_id();

Пример:

$jdb->insert('users', Array('name'=>'username'));
echo $jdb->last_insert_id();

Exist

Проверяет существование таблицы. Возвращает true или false;

Пример:

$jdb->exist('user');

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

Jsonsql::request('select * from `users`', $path);

$path — путь от корня до папки, в которой хранятся файлы. По умолчанию $path = $_SERVER[«DOCUMENT_ROOT»].‘/jdb/’.

Так как в php есть возможность создавать функции и классы с одним именем, то можно применить следующую конструкцию:

function Jsonsql($string, $path = false){
    return Jsonsql::request($string, $path);    
}

Пример:

Jsonsql('create table `new` (id auto_increment, title default "untitled", text)');
Jsonsql('select `name`,`title` from `itsac` where `id` in(1,34,5,9,4,100) order by rand()', '/jdb/test/');
Дополнительные запросы

Узнать статус запроса:

Jsonsql('status');        #вернет сообщение о статусе запроса
Jsonsql('status code'); #вернет статус код запроса

Узнать id добавленной записи в базу данных:

Jsonsql('last_insert_id');

Узнать существует таблица или нет:

Jsonsql('table exists `users`');

Сравнение Jsondb с MySql

Конечно, тут и сравнивать то нечего, базы данных для того и созданы, чтобы хранить данные и быстро получать к ним доступ. Но все же интересно.

Для сравнивания быстродействия и количества используемой памяти, был выполнен ряд тестов для методов insert, update и select.

Insert

Была выполнена десять раз запись десяти рядов в базу. Ниже представлен график зависимости времени выполнения скрипта от количества выполненных операций.

Используемая память:

  • Jsondb — 525.67 Kb.
  • MySQL — 421.16 Kb.

Видно, что быстродействие Jsondb очень сильно зависит от количества записей в таблице.

Update

Было выполнено обновление 100 записей в базе данных.

  • Jsondb — 0.03223 сек., 626.66 Kb.
  • MySQL — 0.01991 сек., 470.84 Kb.

Select

Была выполнена выборка всех записей из базы данных.

  • Jsondb — 0.00313 сек., 626.66 Kb.
  • MySQL — 0.00391 сек., 387.69 Kb.

И выборка данных из базы с условиями where, order и limit.

  • Jsondb — 0.02123 сек., 626.66 Kb.
  • MySQL — 0.03991 сек., 387.69 Kb.

Из всего этого следует, что быстродействие такой системы хранения данных, особенно при использовании методов update и insert, очень сильно зависит от количества записей в одной таблице. Выборка данных из таблиц происходит достаточно быстро. Использование такого метода хранения информации хорошо подходит для хранения различных настроек приложений и временных данных. Как было сказано выше, в этом так же есть большой плюс из-за того, что к любой информации, хранимой в данном виде, можно получить доступ с клиентской части приложения. Если подробнее, то например с помощью JQuery метода $.getJSON.

Вот ссылка, по которой можно скачать исходники и примеры.

Источник: habrahabr

Комментарии

comments powered by Disqus