FunDB - это база данных, которая является "сердцем" нашего продукта. Она обеспечивает выполнение запросов, сохранение данных, проверку прав доступа и многое другое. Важным принципом её работы является наш подход к настройке. Все ваши метаданные это тоже данные - вся информация о схемах, таблицах, колонках, правах доступа и.т.д. является такими же таблицами и редактируется на общих принципах. При их редактировании база данных автоматически обновляется в соответствии с вашими изменениями.
У каждой сущности есть системные поля, значения которых не может быть установлено или изменено и назначается автоматически:
id
. Имеется всегда. Является главным ключом в терминах SQL;sub_entity
. Имеется у сущностей, у которых есть родительские или унаследованные сущности. Хранит название подвида сущности для конкретной записи в виде JSON. Внимание: внутреннее представление этой колонки отличается от JSON и запрос её значения - это медленная операция. По возможности используйте вместо этого операторы OFTYPE
и INHERITED FROM
, или виртуальные поля.Данные таблицы хранятся в схеме public
. Они описывают текущие настройки базы данных.
У некоторых таблиц также имеется колонка allow_broken
- при её выставлении ошибки в настройке данной сушности не являются критической ошибкой и приводят лишь к неработоспособности данной сущности.
Содержит созданные схемы.
Колонка | Описание |
---|---|
name |
Название схемы. Не может быть пустым, содержать пробелы, строки / и __ . |
Содержит созданные сущности.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязана данная сущность. |
name |
Название сущности. Не может быть пустым, содержать пробелы, строки / и __ . |
main_field |
У каждой сущности определена "главная колонка", которая используется для краткого описания данной записи, напр. при выборе из списков или для отображения в таблицах. При пустом значении main_field используется id . |
is_frozen |
Все изменения для этой сущности запрещены. |
is_abstract |
Сущность является абстрактной, т.е. создавать новые записи для этой сущности нельзя. Используется в связке с наследованием. |
parent_id |
Сущность наследуется от другой сущности. При запросах по сущностям-родителям записи сущностей-детей также будут видны. У сущностей-детей присутствуют все поля сущностей-родителей, а так же их собственные поля. |
save_restore_key |
Альтернативный ключ (из заданных в unique_constraints ), который используется для сохранения и восстановления данных из таблицы. Первый столбец ключа должен быть ссылкой либо на public.schemas , либо на другую сущность с заданным save_restore_key . Рекурсия не поддерживается. |
Содержит колонки с данными для таблиц.
Колонка | Описание |
---|---|
entity_id |
Сущность, к которой относится поле. |
name |
Название колонки. Не может быть пустым, содержать пробелы, строки / и __ , называться id или sub_entity . |
type |
Тип данных. См. типы данных. |
default |
Значение по умолчанию. Задаётся на языке FunQL. Может отсутствовать. |
is_nullable |
Могут ли данные в колонке отсутствовать. |
is_immutable |
Могут ли данные в колонке меняться после создания. |
Содержит вычисляемые колонки, т.е. колонки которые автоматически вычисляются из значений других колонок.
Колонка | Описание |
---|---|
entity_id |
Сущность, к которой относится поле. |
name |
Название колонки. Не может быть пустым, содержать пробелы, строки / и __ , называться id или sub_entity . |
expression |
Выражение для вычисляемой колонки. Задаётся как выражение языка FunQL (напр. "name" || "surname" ). |
is_virtual |
Разрешено ли переопределять выражение поля в дочерних сущностях. Используется для возвращения результатов в зависимости от подтипа записи. Пример использования |
is_materialized |
Кэшировать значение вычисляемого поля в базе данных. Аналогично функционалу AS MATERIALIZED STORED в PostgreSQL. |
Содержит ограничения уникальности, т.е. наборы колонок, значения в которых должны быть уникальны во всей таблице.
Колонка | Описание |
---|---|
entity_id |
Сущность, к которой относится ограничение. |
name |
Название ограничения. Не может быть пустым, содержать пробелы, строки / и __ . |
columns |
Массив выражений, кортежи из которых должны быть уникальны. |
is_alternate_key |
Помечает ограничение как альтернативный ключ. В некоторых запросах к базе на записи можно ссылаться не только через id , но и через альтернативные ключи. Альтернативные ключи также используются для сохранения и восстановления произвольных сущностей. Колонки, входящие в альтернативный ключ, не могут принимать NULL . |
Содержит ограничения на данные, т.е. проверки, которые должна проходить каждая строка в таблице.
Колонка | Описание |
---|---|
entity_id |
Сущность, к которой относится ограничение. |
name |
Название ограничения. Не может быть пустым, содержать пробелы, строки / и __ . |
expression |
Выражение, результат которого должен быть true или null . Задаётся как выражение языка FunQL. Может использовать оператор => . |
Дополнительная информация про ограничения на референс-поля с примерами здесь.
Содержит индексы на таблички. Используется для ускорения тяжёлых запросов. На текущий момент индексы полностью соответствуют создаваемым индексам в PostgreSQL. Рекомендуется изучить её документацию.
На текущий момент поддерживается только оператор индексирования trgm
, который поддерживает строки и типы индексов gin
и gist
. Он создаёт индекс триграм, используя pg_trgm
.
Колонка | Описание |
---|---|
entity_id |
Сущность, к которой относится ограничение. |
name |
Название индекса. Не может быть пустым, содержать пробелы, строки / и __ . |
expressions |
Массив выражений, по которым строится индекс. После выражения можно указывать параметры сортировки (как в ORDER BY и класс операторов индексирования. На данный момент поддерживаемый класс операторов -- trgm , который позволяет создавать GIN-индексы для полнотекстового поиска. |
included_expressions |
Массив выражений, хранимых внутри индекса. Соответствует INCLUDE в CREATE INDEX . |
is_unique |
Должен ли индекс быть уникальным. Это позволяет вводить более гибкие ограничения на уникальность, чем unique_constraints , однако не рекомендуется использовать для этого индекс, если уникальность не надо проверять по выражениям. |
predicate |
Логическое выражение для колонок, по которым строится индекс. Соответствует WHERE в CREATE INDEX . |
type |
Тип индекса. Поддерживаются btree , gist и gin . |
Про индексы на таблицы базы данных с примерами подробнее
Содержит именованные запросы, которые можно вызывать.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязан данный запрос. |
name |
Название запроса. Не может быть пустым, содержать пробелы, строки / и __ . |
query |
Запрос на языке FunQL. |
Содержит генераторы именованных запросов. С их помощью можно наполнять схему именованными запросами автоматически, например, создавая по запросу для каждой сущности в таблице. Для схем с генераторами запросов невозможно создать дополнительные именованные запросы. Генератор -- это модуль ECMAScript, экспортирующий по умолчанию функцию. Сигнатуру генераторов можно изучить в виде сигнатур TypeScript здесь. Запросы в базу из генератора не допускаются. Генератор принимает на вход данные о структуре базы.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязан данный генератор. |
script |
Код генератора на языке JavaScript. |
Содержит атрибуты по умолчанию для полей сущностей. Атрибуты, описанные здесь, автоматически добавляются в запросы, использующие заданные поля. Это позволяет задавать, например, единый caption
для колонки сущности. Атрибуты по умолчанию задаются отдельно для сущностей, к которым они привязаны. Атрибуты для одной сущности объединяются согласно приоритету.
Колонка | Описание |
---|---|
schema_id |
Схема, в которой заданы атрибуты. |
field_entity_id |
Сущность, для которой заданы атрибуты.. |
field_name |
Название поля, для которого заданы атрибуты.. |
priority |
Приоритет атрибутов по умолчанию, по которому они объединяются, если обнаруживаются конфликты. Чем меньше число, тем выше приоритет. |
attributes |
Атрибуты в формате @{ name1 = value1, name2 = value2 } . |
Содержит код действий -- выполняемых на стороне сервера функций, которые работают внутри одной транзакции. Действия имеют доступ к API FunDB, и ограничиваются ролью пользователя, который вызвал действие. Действие -- это модуль ECMAScript, экспортирующий по умолчанию функцию-обработчик. Сигнатуру функций-действий и API, доступный внутри, можно изучить в виде сигнатур TypeScript здесь. Действие может принимать аргументы, которые передаются во время вызова в FunDB, и возвращать данные, которые будут переданы назад клиенту.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязано данное действие. |
function |
Код действия на языке JavaScript. |
Про экшны подробнее и с примерами написано в отдельной статье
Содержит список триггеров, которые выполняются при заданных операциях. Триггером является модуль ECMAScript, экспортирующий по умолчанию функцию-обработчик. Сигнатуры функций-триггеров и API, доступный внутри, можно изучить в виде сигнатур TypeScript здесь. Триггеры, выполняющиеся до операции, могут модифицировать аргументы операции, возвращая новое значение args
. Если модификации не нужны, возвращать необходимо true
. При возврате false
операция считается отменённой; дальнейшие триггеры не запускаются, однако транзакция выполняется до конца.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязан данный триггер. |
trigger_entity_id |
Сущность, на события которой реагирует триггер. |
name |
Название триггера. Не может быть пустым, содержать пробелы, строки / и __ . |
time |
Время выполнения триггера (до или после операции). |
priority |
Приоритет выполнения триггера, при наличии нескольких триггеров для одной операции. |
on_insert |
Триггер реагирует на вставку записей. |
on_update_fields |
Триггер реагирует на изменение записей. Массив, в котором могут быть перечислены названия полей или * . чтобы реагировать на изменения любого поля. |
on_delete |
Триггер реагирует на удаление записей. |
procedure |
Код триггера на JavaScript. |
Про триггере подробнее и с примерами написано в отдельной статье
Содержит список ролей, согласно которым ограничивается доступ к базе данных. Каждая роль описывает сущности и поля, к которым разрешён доступ согласно заданным ограничениям. Роли могут наследоваться от других ролей -- унаследованные разрешения суммируются.
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязана данная роль. |
name |
Название роли. |
Содержит связи родительских ролей с дочерними. Роли могут иметь несколько родителей.
Колонка | Описание |
---|---|
role_id |
Роль, для которой определяется родитель. |
parent_role_id |
Родительская роль. |
Содержит ограничения, заданные для данной роли и сущности. Если ограничения не определены, доступ ко всей сущности запрещён. Если ограничение на определённое действие не задано, всё действие считается запрещённым. Для полного разрешения установите ограничение в true
.
Для сущностей в одной иерархии (например, организаций и людей внутри контактов) доступы складываются как "И" от корня иерархии. Например, если для контактов задано ограничение c
, для организаций -- o
, а для людей -- p
, то при выборке из контактов будет наложено общее ограничение c AND (sub_entity OF TYPE "people" AND p OR sub_entity OF TYPE "organizations" AND о)
. При выборке из людей ограничение будет просто c AND p
.
Колонка | Описание |
---|---|
role_id |
Роль, для которой определяется ограничение. |
entity_id |
Сущность, для которой определяется ограничение. |
insert |
Разрешение на вставку записей. Требует разрешения change как минимум у всех обязательных полей сушности. |
select |
Ограничение на SELECT в виде выражения на языке FunQL. |
update |
Ограничение на UPDATE в виде выражения на языке FunQL. Дополнительно накладываются ограничения из select для сущности и затрагиваемых полей. |
delete |
Ограничение на DELETE в виде выражения на языке FunQL. Дополнительно накладываются ограничения из select для сущности и всех её полей. Требуется разрешение change у всех полей сущности. |
check |
Проверка на допустимость изменений пользователя. Проводится после запросов INSERT и UPDATE . Требуется для INSERT и UPDATE . |
Содержит ограничения, заданные для данной роли и поля сущности. Если ограничения не определены, доступ ко всему полю запрещён. Если ограничение на определённое действие не задано, всё действие считается запрещённым. Для полного разрешения установите ограничение в true
.
Ограничения на поле суммируются с ограничениями на сущность, если поле используется в запросе.
Колонка | Описание |
---|---|
role_entity_id |
Ограничение на сущность, для которого определяется ограничение на поле. |
column_name |
Поле, для которого определяется ограничение. |
select |
Ограничение на SELECT в виде выражения на языке FunQL. |
change |
Разрешить модификацию поля (использование в запросах INSERT и UPDATE . |
Содержит список пользователей, которым разрешён доступ к базе данных.
Колонка | Описание |
---|---|
name |
Идентификатор пользователя (электронная почта, для которой был создан аккаунт). |
is_enabled |
Активирован ли пользователь. |
is_root |
Является ли пользователь администратором базы данных (полный доступ, включая служебные операции). |
role_id |
Роль, к которой принадлежит пользователь. Может отсутствовать (возможно, когда пользователь - администратор). |
Содержит лог событий в базе данных.
Колонка | Описание |
---|---|
transaction_time |
Время транзакции. |
transaction_id |
Локально уникальный идентификатор транзакции. Вместе с "transaction__time" уникально идентифицирует транзакцию в базе данных. |
timestamp |
Время операции. Уникально в пределах одной транзакции. |
source |
Источник события. JSON, в котором поле "source" принимает значения "api" (для операций, выполняемых пользователем) или "trigger" (для операций, выполняемых триггерами). |
user_name |
Пользователь, начавший транзакцию. |
type |
Тип события. |
error |
Тип произошедшей ошибки, если операция завершилась неудачно. |
schema_name |
Название схемы, для которой произошло событие. |
entity_name |
Название сущности, для которой произошло событие. |
entity_id |
Идентификатор записи, для которой произошло событие. |
details |
Детали события в произвольном формате. |
У вашей базы данных есть публичный API, через который вы можете взаимодействовать напрямую с вашими данными. Базой можно пользоваться для ваших собственных решений: она не содержит привязки к FunApp (нашему продукту-конструктору), наоборот - FunApp построен поверх базы, и мы пользуемся теми же публичными вызовами.
API в настоящий момент не имеет стабильной версии.
Детали: FunDB API