PHP / JSON база данных
При разработке 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'=>'habrahabr'), 'posts', 'userId' ); $jdb->create('habr', $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'=>'habr' ), 'order'=>Array('id','desc'), 'limit'=>5 ); $jdb->select('*','habr',$rules); $rules = Array( 'order'=>Array('rand()'), 'limit'=>Array(10,4) ); $select = Array('id','title','userId'); # все равно, что $select ='id,title, userId'; $jdb->select($select, 'habr', $rules);
Insert
Вставка данных в таблицу.
$fdb->Insert($table, $data);
- $data — ассоциативный массив данных для вставки в таблицу.
Пример:
$data = Array('title'=>'new title', 'userId'=>6431); $jdb->insert('habr', $data);
Update
Обновление данных в таблице.
$jdb->update($table, $data, $where);
- $table — название таблицы.
- $data — ассоциативный массив с данными для обновления.
- $where — ассоциативный массив с данными для выбора нужной записи для обновления.
Пример:
$data = Array('title'=>'updated title'); $where = Array('title'=>'new title', 'userId'=>6431); $jdb->update('habr', $data, $where);
Delete
Удаление записей из таблицы.
$jdb->delete($table, $where);
- $table — название таблицы.
- $where — ассоциативный массив данных для выборки нужной записи для удаления.
Пример:
$where = Array('userId'=>6431); $jdb->delete('habr', $where);
Drop
Удаление таблицы.
$jdb->drop($table);
- $table — название таблицы.
Пример:
$jdb->drop('habr');
Alter
Добавление и удаление ключей из таблицы.
$jdb->alter($table, $todo, $keys);
- $table — название таблицы.
- $todo — выполняемое действие. Может быть add или drop.
- $keys — строка или ассоциативный массив данных для удаления или добавления ключей.
Пример:
$jdb->alter('habr', 'drop', 'title','userId'); $keys = Array( 'postTitle'=>Array( 'default'=>'habrapost' ) ); $jdb->alter('habr', 'add', $keys); $keys = Array('acc','userId'); # все равно, что $keys = 'acc, userId'; $jdb->alter('habr', '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 `habr` 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.
Вот ссылка, по которой можно скачать исходники и примеры.