Простая модель данных Gency

В Gency используется Простая модель (базы) данных, описывающая связи между записями основной таблицы (таблицы категорий) и дополнительными таблицами (таблицами объектов):

Служебными полями таблицы категорий являются поля id и mode (bits в Gency). Поле id должно иметь символьный тип. Значения этого поля используются для идентификации категорий и соответствующих им таблиц объектов. Допустимо использовать отдельное поле для идентификации таблиц объектов, но в Gency такая возможность сейчас не поддерживается. Для связывания нескольких записей таблицы категорий с одной таблицей объектов можно использовать представления, отражающие точный или измененный образ таблицы объектов:

Поле mode должно иметь целочисленный тип, обычно беззнаковый. Значения этого поля определяют доступность соответствующей таблицы объектов:

  • 0 – категория не имеет доступную таблицу объектов;
  • 1 – категория не имеет доступную таблицу объектов, но может являться точкой доступа к объектам, хранящимся в какой-либо другой форме;
  • 2 – категория имеет доступную таблицу объектов;
  • 3 – категория имеет доступную таблицу объектов и, вероятно, объект с пустым символьным идентификатором в ней.

Значащими являются только два младших двоичных разряда данного поля, поэтому, например, значение 4 (1002) также будет соответствовать режиму 0.

Служебным полем таблицы объектов является поле id. Оно может иметь как символьный, так и целочисленный тип, обычно беззнаковый. Значения этого поля используются для идентификации объектов в пределах одной таблицы.

Для доступа к произвольным объектам базы данных используются составные идентификаторы, включающие идентификатор категории и идентификатор объекта в пределах одной таблицы, например в Gency на уровне интерфейса пользователя используются адреса вида /id_категории/id_объекта (в случае объекта с пустым символьным идентификатором – /id_категории).

В Gency не поддерживается редактирование записей таблицы категорий, их детальное отображение в режимах 2 и 3, а также какое-либо отображение в режимах 0 и 1. Но к ним можно организовать доступ, как к объектам, используя категорию с рекурсивной связью, т.е. связанную с самой таблицей категорий (напрямую или через представление). Например, можно создать представление site_pages для доступа к категориям с режимом 0 при помощи такого запроса:

CREATE ALGORITHM=MERGE VIEW `site_pages` AS
  SELECT `id`, `name`, `content` FROM `site_categories` WHERE `bits`&3=0

Для использования этого представления можно создать категорию pages при помощи такого запроса:

INSERT INTO `site_categories` (`id`, `name`, `content`, `bits`) VALUES
('pages', 'Страницы', '', 3)

Такая необычная организация доступа к записям таблицы категорий является очень гибкой при настройке под конкретные нужды.

Комментарии: 2

  1. Tead

    Не пойму, как связать категории с объектами.

  2. Админ

    Нужно размещать объекты в отдельных таблицах, используя символьный идентификатор категории при формировании имени соответствующей таблицы объектов. Сейчас в Gency используется такое правило формирования имени таблицы объектов: берется символьный идентификатор категории, в котором все дефисы заменяются на символы подчеркивания, после чего к нему добавляется табличный префикс, например site_ или просто символ подчеркивания.

    Также можно размещать объекты в единой таблице и делить их на группы при помощи представлений. Пример создания таких представлений можно найти в статье Как сделать фильтрацию элементов по уровню иерархии?

    Для обратного связывания можно добавить в таблицы объектов специальное поле, предназначенное для хранения идентификаторов категорий. Смотрите тот же пример по ссылке из предыдущего абзаца, в котором связующим является поле div (поле cat там используется для связывания на более глубоком уровне вложенности).

Отправить комментарий

Ваш адрес E-mail не будет опубликован.