Pull to refresh

PHP / JSON база данных

Reading time 5 min
Views 68K
При разработке 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
Была выполнена десять раз запись десяти рядов в базу. Ниже представлен график зависимости времени выполнения скрипта от количества выполненных операций.
image
Используемая память:
  • 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.

Вот ссылка, по которой можно скачать исходники и примеры.
Tags:
Hubs:
+34
Comments 40
Comments Comments 40

Articles