Полная модель данных: сущности JSON, связи и онтология

На этой странице описана полная модель данных аккаунта Omniscol: сущности, их основные поля и связи. Она продолжает концептуальную страницу Организация данных, которая объясняет, зачем всё устроено так (справочник школы ↔ расписание, локальные копии); здесь речь о том, что именно хранится: это пригодная для работы структурная карта, в частности чтобы связать модель с внешним справочником (ERP-системой, каталогом пользователей, информационной системой).

Техническая страница. Этот справочник предназначен для интеграции и сопоставления с внешней системой. Он не нужен для повседневной работы в Omniscol: чтобы понять, как организованы данные с прикладной точки зрения, см. Организация данных.

Все данные учебного заведения организованы в виде дерева. Описанные ниже сущности (пользователи, учебные годы, расписания, отсутствия, события и т. д.) соответствуют разным ветвям этой структуры. Нормативный источник — JSON-схема аккаунта. Её можно посмотреть в двух видах:

  • исходный текст (JSON-схема как есть), который аккаунт отдаёт по адресу https://api.omniscol.com/api/guest/school_schema.json;
  • древовидный просмотр, удобный для чтения, на странице omniscol.com/fr/datamodel (а соответствующий справочник API — на странице omniscol.com/fr/developers).

Эта схема точно описывает физическое хранение в базе в виде JSON-документа. На этой странице приведено её упорядоченное изложение, которое не меняется со временем.

Документ школы: корень

Корневой документ объединяет постоянный справочник учебного заведения и всё его планирование. Поддеревья первого уровня:

Корневой ключ Сущность Роль
config SchoolConfig Параметры аккаунта (страна, опции, часовой пояс, внешняя синхронизация)
subjects_custom словарь SubjectFull Собственные дисциплины школы
families_custom словарь Family Собственные семейства дисциплин
users словарь User Каталог пользователей (все роли)
school_years массив SchoolYear Учебные годы и каникулы
timetables словарь Timetable Расписания
absences группа Absence* Отсутствия (преподавателей, классов, сотрудников, учеников)
staffing Staffing Модуль управления персоналом и надзора
panels словарь Panel Информационные панели
events словарь Event Календарные события
api, snapshots, jobs, translations, logo разное Технические настройки и журналы

Поддеревья, названные «словарём», — это JSON-объекты, в которых ключи являются стабильными идентификаторами (основа любого внешнего связывания — см. последний раздел).

config

subjects_custom

families_custom

users

school_years

timetables

staffing

absences

panels

events

SCHOOL

string

_id

домен учебного заведения

string

name

название аккаунта

string

country

страна аккаунта

string

current_school_year

текущий учебный год

CONFIG

SUBJECT

FAMILY

USER

SCHOOL_YEAR

TIMETABLE

STAFFING

ABSENCE

PANEL

EVENT

Сквозные поля: _extids и wishes

Два поля встречаются во многих сущностях. Чтобы не повторять их в каждой схеме, они описаны один раз здесь.

  • _extids (ExternalIds) — таблица идентификаторов сущности во внешних системах, например { "auriga": "12345" }. Есть у сущностей, которые можно синхронизировать (дисциплины, семейства, пользователи, площадки, кабинеты, ресурсы, преподаватели, классы, группы…). Это точка привязки для сопоставления с внешним справочником (см. последний раздел).
  • wishes — временные ограничения: доступность, желательные слоты или слоты, которых следует избегать, максимальная нагрузка в часах, предпочитаемый кабинет… Есть у большинства сущностей, которые можно планировать: пользователей, преподавателей расписания, курсов (дисциплин класса), групп, классов, кабинетов, временных диапазонов площадки, сеток надзора. В зависимости от охвата эти ограничения общие (на уровне школы) или относятся к одному расписанию.

Уровень 1 — Справочник школы

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

family

parent

распределения по годам

groups

holidays

FAMILY

string

name

string

code

SUBJECT

string

name

string

short

краткое название (для отображения)

string

code

string

parent

родительская дисциплина

string

family

семейство

string

color

object

_extids

внешние идентификаторы

USER

string

login

string

first_name

string

middle_name

(если уместно для страны)

string

last_name

string

idnumber

официальный идентификатор

array

roles

admin teacher staff student

string

customrole

Настраиваемая роль

int

servicehours

базовая часовая нагрузка

bool

external

внешний преподаватель

object

subjects

преподаваемые дисциплины

object

wishes

общая доступность

object

_extids

PLACEMENT

string

class

назначенный класс

string

date_start

string

date_end

array

groups

назначенные группы

PLACEMENT_GROUP

string

group

группа, группа групп или виртуальная группа

array

weeks

диапазоны недель

SCHOOL_YEAR

string

name

string

date_start

string

date_end

array

altweeks

чередование недель

HOLIDAY

string

name

string

begin

string

end

Дисциплины — SubjectFull / Subject / Family

Собственная дисциплина (SubjectFull) расширяет базовую дисциплину (Subject: name, short, code, type, _extids) полями parent, family и color. На уровне школы сосуществуют два источника: общие дисциплины страны (только для чтения) и собственные дисциплины учебного заведения. Подробное описание функций: Управление дисциплинами.

Пользователи — User (включая преподавателей)

User — это единая сущность каталога: личные данные (фамилия, имя, idnumber, контакты), аутентификация (login), roles, базовая часовая нагрузка (servicehours), общая доступность (поле wishes) и placements. Преподаватель — не отдельная сущность: это User, у которого среди roles есть teacher (один и тот же пользователь может совмещать несколько ролей). Поле placements (индексируется по учебному году) привязывает ученика к class и groups на определённый период. Подробности: Управление преподавателями.

Учебные годы — SchoolYear / Holiday

SchoolYear задаёт date_start → date_end, список holidays и altweeks (чередование недель). Это временные рамки, а не контейнер: расписания разворачиваются внутри них, но не вложены в них. См. Учебный год.

Уровень 2 — Расписание

Timetable — это целостная единица планирования. У него есть собственная локальная копия преподавателей, классов, групп и дисциплин — о принципе локальной копии см. Организация данных.

config

sites

teachers

classes

lessons (группы групп, несколько групп)

classrooms

resources

subjects

groups

lessons

parent (иерархия)

источник (частичная локальная копия)

teachers по умолчанию

частичная локальная копия и неявная связь по идентификатору

составляющие группы

TIMETABLE

bool

active

опубликовано?

array

lessons

общие занятия

TIMETABLE_CONFIG

string

type

week cycle calendar

int

time_period

продолжительность слота

int

time_unit

дробление слота

array

weekdays

рабочие дни

string

displaymode

hours periods agenda

int

cycle

длина цикла

array

dates

границы для calendar

object

date_windows

окна формирования

TIMETABLE_SITE

string

name

object

distances

расстояния между площадками

object

hours

временные сетки

TIMETABLE_TEACHER

string

first_name

string

last_name

string

virtual_name

вакансия

array

subjects

дисциплины виртуальной вакансии

string

idnumber

int

servicehours

можно переопределить для расписания

string

classroom

предпочитаемый кабинет

TIMETABLE_CLASS

string

name

string

level

string

campus

array

sites

учитывается только одна площадка

int

studentsnb

расчётное число учеников (для подбора подходящего кабинета)

string

classroom

кабинет по умолчанию

bool

offgrid

вне сетки (calendar)

string

videolink

ссылка на видеоконференцию по умолчанию для всех занятий

string

resourcelink

ссылка на ресурс (LMS) по умолчанию для всех занятий

LESSON

TIMETABLE_CLASSROOM

string

name

int

capacity

string

specialisation

произвольная специализация

int

maxclasses

одновременные классы

string

building

string

description

произвольное описание

array

tags

метки характеристик или оборудования

TIMETABLE_RESOURCE

string

name

int

number

доступное количество

TIMETABLE_CLASS_SUBJECT

string

code

наследуется от Subject

array

incompatibilities

несовместимости

number

pweight

педагогический вес

array

teachers

преподаватели по умолчанию

number

minutes

целевая нагрузка

string

specialisation

требуемый кабинет

TIMETABLE_CLASS_GROUP

string

name

string

code

bool

free

свободная группа

string

parent

родительская группа

int

studentsnb

расчётное число учеников (для подбора подходящего кабинета)

SUBJECT

USER

GROUPSET_ITEM

string

name

string

code

array

groups

идентификаторы групп

Конфигурация — TimetableConfig

Определяющее поле — type: week (повторяющаяся неделя), cycle (цикл из нескольких дней, см. cycle) или calendar (реальные даты, см. dates). time_period и time_unit задают структуру сетки; weekdays — рабочие дни; date_windows — окна ограничений для автоматического формирования расписания.

Площадки, кабинеты, ресурсы

TimetableSite (площадка) содержит свои classrooms (TimetableClassroom: capacity, specialisation, maxclasses, building) и свои resources (TimetableResource: number — доступное количество; система следит, чтобы ресурс не был забронирован сверх этого количества). distances описывает время в пути между площадками. См. Площадки, кабинеты, ресурсы и Специализации кабинетов.

Преподаватели расписания — TimetableTeacher

Дополненная частичная копия User: копируется лишь несколько идентифицирующих полей (first_name, last_name, idnumber), к которым добавляются поля, нужные для планирования (переопределяемое servicehours, предпочитаемый classroom, wishes для конкретного расписания). Непустое virtual_name обозначает виртуального преподавателя (вакансию, за которой нет реального User).

Классы, дисциплины класса, группы

  • TimetableClass: name, level, campus/sites, studentsnb и три ключевых поддерева — subjects, groups, lessons.
  • TimetableClassSubject: локальная копия дисциплины (расширяет Subject), дополненная для планирования: minutes (целевая нагрузка), pweight (педагогический вес), incompatibilities, teachers по умолчанию, specialisation кабинета. Назначение дисциплины с типом занятия создаёт отдельную запись для каждого типа. См. Курсы, занятия и типы занятий.
  • TimetableClassGroup: часть класса. free=true отключает конфликты с остальным классом (свободная группа); parent выстраивает иерархию — см. иерархия групп.

Правила между группами — разделения, совмещения, группы групп

Связи между группами хранятся в поддереве groups расписания и бывают трёх видов:

Схема Сущность Смысл Страница
TimetableGroupTimeset разделение Взаимоисключающие группы одного класса, стоящие в расписании параллельно (половины класса, факультативы) Разделение класса
TimetableGroupSpaceset совмещение Группы разных классов, которые занимаются вместе в зеркальных слотах Совмещение групп
TimetableGroupGroupset группа групп Метагруппа (GroupsetItem: name, code, groups[]), объединяющая несколько групп Группы групп

См. также общий обзор Класс, группа, подгруппа.

Уровень 3 — Занятия

Занятие (Lesson) — это единица обучения, которая реально размещена в расписании: продолжительность, дисциплина, группа, преподаватель (преподаватели), кабинет, ресурсы, позиция и статус. Оно формируется на основе дисциплины класса (см. уровень 2) и относится либо к классу (class.lessons), либо непосредственно к расписанию (timetable.lessons) — последний вариант для групп групп и занятий для нескольких групп, общих для нескольких классов.

lessons (занятия класса)

lessons (группы групп, несколько групп)

assoc · concat · weekalt (сложные занятия)

group

teachers

classroom

resources

memos

position

TIMETABLE_CLASS

LESSON

int

duration

в числе периодов

int

duration_actual

фактические минуты

int

duration_accounted

оплачиваемые минуты

string

modality

in_person remote hybrid self_study

string

subject

идентификатор дисциплины

string

group

идентификатор группы

array

teachers

null принудительно означает отсутствие преподавателя

string

classroom

null принудительно означает отсутствие кабинета

string

status

planned draft canceled done

string

_id

стабильная идентичность занятия

string

_osrev

ревизия (оптимистичная блокировка)

TIMETABLE

TIMETABLE_CLASS_GROUP

TIMETABLE_TEACHER

TIMETABLE_CLASSROOM

TIMETABLE_RESOURCE

MEMO

string

comment

string

pub

видимость комментария

string

owner

int

tstp

отметка времени

POSITION

string

day

дата, день недели или номер дня цикла

int

period

индекс слота в сетке

string

start

точное время начала HH:MM (только вне сетки)

string

end

точное время окончания HH:MM (только вне сетки)

bool

fixed

занятие заблокировано (не перемещается при формировании)

Основа занятия

Занятие содержит поля планирования — duration (в периодах), duration_actual / duration_accounted (фактические / оплачиваемые минуты), modality, subject, group, teachers, classroom, resources, — к которым добавляются position, status, memos и идентичность (_id, _osrev). Если задать teachers или classroom равными null, это явно задаёт отсутствие преподавателя или кабинета.

Сложные занятия

Одно занятие может объединять другие:

  • assoc — связанные занятия: группы меняются местами вместе.
  • concat — сдвоенные занятия: строго друг за другом.
  • weekalt — чередование недель: свой вариант занятия на каждую неделю.

Эти механизмы образуют сложные занятия — см. Сложные занятия: чередующиеся, связанные, сдвоенные.

Позиция занятия

position — это объект, который размещает занятие во времени. Он включает следующие поля:

  • position.day — день занятия, полиморфное поле, зависящее от режима расписания: название дня (monday…sunday) в недельном режиме, номер дня цикла ("1", "2"…) в циклическом режиме или дата YYYY-MM-DD в режиме календаря. Это одно и то же поле, которое меняет форму в зависимости от режима; оно присутствует всегда.
  • position.period — индекс слота во временной сетке. Занятие без period и без start/end соответствует праздничному дню.
  • position.start / position.end — точное время начала и окончания (HH:MM) для занятий вне сетки или в режиме календаря, которые не совпадают со стандартным слотом.
  • position.fixed — булево значение (по умолчанию ложь): заблокированное занятие, которое автоматическое формирование расписания не переместит.

Занятия класса хранятся в class.lessons; массив timetable.lessons содержит общие занятия, связанные с группами групп.

Идентичность занятия

У каждого занятия есть два технических поля идентичности, доступные в аккаунтах Premium:

  • _id — стабильный идентификатор, присваиваемый при создании занятия и в дальнейшем неизменный (он сочетает отметку времени и отпечаток содержимого). Это ключ занятия для совместного редактирования и для внешнего инструмента, который отслеживает занятия во времени. Для повторяющихся экземпляров календарного расписания (чередование недель, сдвоенные занятия, связанные занятия) _id каждого экземпляра производится от _id базового занятия, так что исходный идентификатор остаётся узнаваемым.
  • _osrev — маркер ревизии (оптимистичная блокировка), который увеличивается при каждом изменении (отметка времени + индекс изменения) и строго упорядочен по алфавиту (так легко определить, новее ли одна ревизия другой). Он позволяет совместному редактированию обнаруживать и сливать одновременные изменения: устаревшая клиентская ревизия сигнализирует о конфликте, который сервер разрешает или сливает вместо того, чтобы молча перезаписать данные.

Отсутствия

У отсутствий общая основа (Absence: date_start, date_end, reason, hours, comment, статус), которая уточняется для каждого субъекта.

teachers

classes

staff

students

substitutes

ABSENCE

ABSENCE_TEACHER

string

date_start

string

date_end

string

reason

ключ перевода или название

array

subjects

затронутые дисциплины

array

classes

затронутые классы

string

status

ABSENCE_CLASS

ABSENCE_STAFF

ABSENCE_STUDENT

string

date_start

string

reason

array

subjects

исключённые дисциплины

string

status

SUBSTITUTE

string

substitute

имя замещающего

string

date_start

начало правила (дата)

string

date_end

окончание правила (дата)

array

hours

затронутые слоты (begin/end в минутах, day)

array

classes

затронутые классы

array

subjects

затронутые дисциплины

string

comment

комментарий

AbsenceTeacher можно ограничить определёнными subjects/classes; в ней хранится массив правил замещения (substitutes, каждое из которых — это AbsenceTeacherSubstitute: замещающий, период, временные слоты, классы и дисциплины, которые охватывает правило). Статусы различаются для каждого субъекта (например, ok/aborted для класса). См. глоссарий Замещение / Замена и модуль Управление отсутствиями.

Сотрудники

Отдельный модуль (его можно приобрести и самостоятельно) для надзора и дежурств персонала.

grids

assignments

staff

schedule

needs

STAFFING

STAFFING_GRID

array

dates

периоды работы

array

days

array

periods

слоты

STAFFING_ASSIGNMENT

string

name

int

req

минимальное число сотрудников

int

ideal

желательное число

string

site

string

priority

high normal low

array

allowed_staff

STAFFING_STAFF_MEMBER

string

first_name

string

last_name

string

virtual_name

вакансия

string

color

STAFFING_SCHEDULE

object

dates

смены по датам

STAFFING_NEED_SPAN

string

day

день или дата

string

begin

HH:MM

string

end

HH:MM

int

headcount

требуемое число

StaffingGrid — это шаблон (дни, периоды); assignments описывают посты (req/ideal, priority, needs, подробно расписанные по слотам через StaffingNeedSpan); schedule фиксирует фактические смены по датам. См. модуль Управление персоналом.

События

Event — это запись календаря, наложенная поверх сетки: то, что происходит в учебном заведении и не является обычным занятием — педагогический совет, родительское собрание, однодневный экзамен, экскурсия, день открытых дверей. События хранятся в словаре events (ключи event-<n>) и входят в функции Premium.

Поля Event (обязательные: title, start, end):

  • title — отображаемое название.
  • start / end — начало и окончание в формате YYYYMMDDTHHmmSS.
  • rrule — необязательное правило повторения.
  • attendees — участники: пользователь, класс, группа, произвольное название (custom), либо всё учебное заведение (everybody) / любой желающий (anyone).
  • location — место (места): кабинет расписания или произвольное название.
  • resources — ресурсы, зарезервированные для события.
  • videolink — ссылка на видеоконференцию для дистанционного участия.
  • memos — комментарии; color — цвет (шестнадцатеричный).

О работе с событиями в интерфейсе (создание, размещение на сетке, поля интерфейса) рассказано на странице Разовые события.

Информационные панели

Panel — это информационная панель с занятиями дня (холл, кабинет, экран в приёмной…). Она задаёт выбор columns, topline, filters/exclusions и настройки внешнего вида. См. глоссарий Информационная панель.

Идентификаторы, локальные копии и связывание с ERP

Чтобы связать модель Omniscol с внешним справочником, главное — три принципа:

  1. Ключи словарей — это стабильные идентификаторы. Дисциплины, пользователи, преподаватели, классы, группы, кабинеты, ресурсы индексируются неизменным идентификатором (JSON-ключом), а не названием. Именно эту основу — никогда не name — следует использовать для любого соответствия.

  2. Поле _extids (ExternalIds) хранит внешние идентификаторы. Оно есть у сущностей, которые можно синхронизировать (Subject, Family, TimetableSite, TimetableClassroom, TimetableResource, TimetableTeacher, TimetableClass, TimetableClassGroup, User…) и сопоставляет каждой сущности её идентификаторы в сторонних системах, например { "auriga": "12345", "aimaira": "67890" }. Это каноническая точка привязки для двустороннего сопоставления.

  3. Локальная копия «школа ↔ расписание» сделана намеренно. Дисциплина класса или преподаватель расписания — это дополненная копия, а не живая ссылка. Поэтому внешний справочник должен решить, на каком уровне он сопоставляется: со справочником школы (постоянный каталог) или с конкретным расписанием (планирование с датами). Подробно правила распространения изменений описаны на странице Организация данных.

Конфигурация синхронизации находится в config.extsync (SchoolConfigExtsync): systems (настроенные коннекторы), sync (направление и сущности), export и schedules, а также таблицы соответствия (mappings) по ключу и идентификатору Omniscol. Что касается программного доступа, REST API и токены описаны на странице Токены API; коннекторы синхронизации — на странице Синхронизация с внешними системами.

Точная и исчерпывающая форма каждого поля определяется эталонной JSON-схемой аккаунта (https://api.omniscol.com/api/guest/school_schema.json, удобный для чтения просмотр на omniscol.com/fr/datamodel). Если эта страница и схема расходятся, верна схема.

См. также