### Таблица `Role` (роли пользователей) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор роли | | name | VARCHAR(50) | NOT NULL, UNIQUE | Название роли (Родитель, Ребёнок, Администратор) | ### Таблица `Person` (физические лица) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор человека | | first_name | VARCHAR(50) | NOT NULL | Имя | | last_name | VARCHAR(50) | NOT NULL | Фамилия | | middle_name | VARCHAR(50) | | Отчество (необязательно) | | role_id | INTEGER | NOT NULL, FOREIGN KEY → Role(id) | Роль человека | ### Таблица `School` (школы) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор школы | | name | VARCHAR(100) | NOT NULL | Наименование школы | ### Таблица `Source` (источники информации о центре) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор источника | | name | VARCHAR(100) | NOT NULL | Название источника (соцсети, интернет, друзья и т.д.) | ### Таблица `Events` (мероприятия) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор мероприятия | | name | VARCHAR(200) | NOT NULL | Название мероприятия (Мастер-класс, Хакатон и т.д.) | ### Таблица `Application` (заявки) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор заявки | | parent_id | INTEGER | NOT NULL, FOREIGN KEY → Person(id) | Родитель (кто подаёт заявку) | | child_id | INTEGER | NOT NULL, FOREIGN KEY → Person(id) | Ребёнок (участник) | | school_id | INTEGER | FOREIGN KEY → School(id) | Школа ребёнка | | class_number | INTEGER | | Номер класса (целое число) | | phone | VARCHAR(20) | NOT NULL | Контактный телефон родителя | | email | VARCHAR(100) | NOT NULL | Email родителя | | is_offline | BOOLEAN | NOT NULL DEFAULT TRUE | Формат: TRUE = очный, FALSE = дистанционный | | source_id | INTEGER | FOREIGN KEY → Source(id) | Откуда узнал о центре | | consent | BOOLEAN | NOT NULL DEFAULT FALSE | Согласие на обработку ПД | | created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | Дата и время создания заявки | | updated_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | Дата и время последнего изменения | ### Таблица `Application_items` (состав заявки: мероприятия) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | application_id | INTEGER | PRIMARY KEY, FOREIGN KEY → Application(id) | Идентификатор заявки | | event_id | INTEGER | PRIMARY KEY, FOREIGN KEY → Events(id) | Идентификатор мероприятия | *Примечание: составной первичный ключ гарантирует уникальность пары (заявка, мероприятие).* ### Таблица `Notification` (уведомления) | Поле | Тип данных | Ограничения | Описание | |------|------------|-------------|----------| | id | SERIAL | PRIMARY KEY | Идентификатор уведомления | | application_id | INTEGER | NOT NULL, FOREIGN KEY → Application(id) | Заявка, по которой отправлено уведомление | | sent_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | Дата и время отправки | | type | VARCHAR(20) | | Тип уведомления (parent – родителю, admin – администратору) | ### 2.3. Первичные и внешние ключи, ограничения - **Первичные ключи** указаны в таблицах (столбцы id, либо составной ключ в Application_items). - **Внешние ключи**: - Person.role_id → Role.id - Application.parent_id → Person.id - Application.child_id → Person.id - Application.school_id → School.id - Application.source_id → Source.id - Application_items.application_id → Application.id - Application_items.event_id → Events.id - Notification.application_id → Application.id - **Ограничения CHECK** (можно добавить, но не обязательно): - Для поля is_offline: TRUE или FALSE (булево само по себе). - Для class_number: от 1 до 11 (CHECK (class_number BETWEEN 1 AND 11)). - Для phone: формат проверяется приложением, в БД не обязательно. ### 2.4. SQL-скрипт создания таблиц Ниже приведён скрипт для СУБД PostgreSQL (совместим с SQLite при замене SERIAL на INTEGER PRIMARY KEY AUTOINCREMENT). Скрипт сгенерирован на основе схемы. ```sql -- Создание таблиц CREATE TABLE Role ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE Person ( id SERIAL PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, middle_name VARCHAR(50), role_id INTEGER NOT NULL REFERENCES Role(id) ); CREATE TABLE School ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL ); CREATE TABLE Source ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL ); CREATE TABLE Events ( id SERIAL PRIMARY KEY, name VARCHAR(200) NOT NULL ); CREATE TABLE Application ( id SERIAL PRIMARY KEY, parent_id INTEGER NOT NULL REFERENCES Person(id), child_id INTEGER NOT NULL REFERENCES Person(id), school_id INTEGER REFERENCES School(id), class_number INTEGER, phone VARCHAR(20) NOT NULL, email VARCHAR(100) NOT NULL, is_offline BOOLEAN NOT NULL DEFAULT TRUE, source_id INTEGER REFERENCES Source(id), consent BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE Application_items ( application_id INTEGER NOT NULL REFERENCES Application(id), event_id INTEGER NOT NULL REFERENCES Events(id), PRIMARY KEY (application_id, event_id) ); CREATE TABLE Notification ( id SERIAL PRIMARY KEY, application_id INTEGER NOT NULL REFERENCES Application(id), sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, type VARCHAR(20) );