Проект ACIS: содержание, old manual.
Именно системные профили, в том смысле, что принадлежат и создаются они системой, в отличие от UserData. Июль 2004.
Требования:
Пожелания:
Делаем таблицу, например, acis.sysprof, с двумя столбцами: id и data. В поле id (тип данных: CHAR(200) PRIMARY KEY) мы пишем идентификатор пользователя или записи. В data (тип: BLOB) — Perl Storable’s дамп структуры. Структура — всегда хэш.
Далее, пишем простые функции для доступа: чтения и сохранения данных (всей структуры) для определённого id. Модуль ACIS::Web::SysProf, пространство имён: ACIS::Web.
Далее, пишем вспомогательные функции для:
Для обеспечения сохранности данных, периодически делаем архивирование (например, скрипт arpm-backup).
Вызывает сомнения этот элементарный интерфейс. Сомнения: удобство и эффективность (в смысле скорости).
А главное—несколько процессов одновременно не могут доступаться до этих данных.
Совершенно другой вариант. Вместо чистой и гладкой таблицы sysprof, где каждой записи или пользователю соответствует одна строка, одна структура, мы можем сделать эту таблицу кучей (a heap).
CREATE TABLE acis.sysprof ( id char(200), param char(40),
data BLOB, PRIMARY KEY ( id, param ) )
Интерфейс:
Соответственно:
Ну, ещё понадобится функция rename_id( OLD, NEW ). И для человеческого удобства, возможно, get_user_sp_value( PARAM ); put_user_sp_value( PARAM, VALUE ) и get_record_sp_value(), put_record_sp_value().
Таблица будет быстро расти с ростом количества используемых параметров, причём id будет дублироваться много-много раз.
Thread-safety. Относительная безопасность для доступа одновременно несколькими процессами. Относительная потому, что если два разных процесса в один и тот-же момент пишут в один и тот-же параметр, то первая из операций будет похоронена второй.
Иначе говоря, просто придётся очень аккуратно отслеживать кто что может писать и нет способа глобально защититься от нарушения правил.
Для краткости здесь вместо id для записей можно использовать их short-id.
Для порядка, необходимо вести учёт параметров, смысла и форматов их значений.
Видите ли, в разрозненном хранении параметров Системного Профиля и вообще в существовании этого отдельного системного профиля есть проблема. Она происходит от того, что логическая связь между данными userdata и данными из системного профиля очень сильна, а разница — тонка. В некоторых случаях, последовательное, логичное использование системного профиля значительно усложнит всю ситуацию с хранением и извлечением данных (из долговременной памяти).
В ARDB-эшной обработке userdata-файлов (записей) участвует поле static_url. А логически оно более относится к системному профилю. В этом и в некоторых других случаях нет чёткой ясности: логичней хранить параметр в userdata или в системном профиле.
Можно принять за критерий вопрос: является ли поле в прямой власти пользователя? (Может ли пользователь 100%-но контролировать содержимое поля?) Если является (может на 100%), то поле должно храниться в userdata. Но это логично лишь с одной стороны. С точки зрения использования данных, логично и вспомогательную информацию держать тут-же, рядом с первичной.
Отсюда возможен такой путь: разбивать каждую запись на пользовательскую и системную части. В принципе, разумно. Только вот thread-safety…
Короче говоря, сейчас стратегия такая: мы продолжаем использовать userdata для данных, которые могут там храниться, для которых нет необходимости в thread-safe доступе. (Исключение: те, которые усложняют выявление пользовательских изменений, типа last-login-date.)
Что необходимо для Автоматическая поддержка research профайла — выносим в SysProfile. (Собственно, возможно, всё необходимое я уже и вынес…)
Помним об этом сложном компромисе и ищем хорошее и надёжное решение.
(Таким решением могло бы стать хранение всего юзерского профиля в базе данных с чётким атомистическим локинг-контролем… Мама моя!)