SKY / WINGS / FIRST / MEMORY /
CONF1

В таблице memory, в ряду с ID=3 содержатся конфигурационные данные приложения, те которые не вошли в файл main/conf.php. Один конфигурационный параметр занимает одну строку и разделен от других символом \n. Формат такой:

имя_переменной значение

Такой способ хранения данных хорош следующим: все конфигурационные данные считываются одним запросом как одна ячейка, при добавлении новых данных не нужно добавлять новые ряды или делать "alter table", что повышает скорость разработки. Для упаковки и распаковки данных используется стандартный функционал ядра, все делается автоматически. Несколько измененных данных записываются одновременно, одним UPDATE запросом, к одному ряду в БД.

Распаковка данных делается с помощью метода $sky->explode() во время вызова $sky->load(), а упаковка $sky->implode() во время завершения работы скрипта в деструкторе объекта SKY.

Конфигурационные данные доступны в глобальной области видимости и имеют префикс $s_, т.е. как $s_имя_переменной и как свойства объекта SKY, например $sky->s_имя_переменной. Дублирование не занимает вдвое больший объем памяти ОЗУ, так как используются переменные ссылки и специальные методы объектов __get(), __set(). Чтобы изменить значение переменной в БД достаточно просто присвоить новое значение свойству объекта SKY (но не переменной с префиксом в глобальной области видимости), например:

$sky->s_имя_переменной = new_value;

Если старое и новое значение переменной совпадает, запрос UPDATE к БД вообще, может не произойти. Алгоритм работы таков: считывается ячейка со всеми совокупными данными как строка и запоминается, потом данные распаковывается и помещаются в массив $sky->mem['s']. В течении работы скрипта данные могут измениться и если это произошло (специальный флаг меняет значение с false на true), данные упаковываются в новую строку и сравниваются со старой строкой, если они разные, только тогда делается запрос UPDATE к БД.

Методы распаковки и упаковки применяются не только к конфигурационным данным приложения. Так в таблице посетителей visitors есть колонка vmemo, для работы с данными подобным образом, а распакованные данные помещаются в $sky->mem['v']. Данные доступны через объект $user с префиксом v_, например $user->v_user_agent. Аналогично, для таблицы зарегистрированных пользователей, а распакованные данные помещаются в массив $sky->mem['u'], значения доступны как свойства USER с префиксом u_, например: $user->u_lang.

Вышеуказанное применение модели хранения данных полезно для большинства веб-приложений, и является частью ядра Framework, но эту модель можно применять и для уникальных элементов приложения, с префиксами отличными от s, v, u.

Недостатком такой модели хранения данных является невозможность построения индексов, поэтому к данным, для которых в БД нужно построить индексы, не следует применять такую модель, а использовать отдельные колонки в таблицах.
опубликовано ENERGY - 4 Oct 2015 12:11 GMT
последнее редактирование - 4 Oct 2015 14:40 GMT
комментировать