|
|
@@ -1,2 +1,152 @@
|
|
|
-# lab11
|
|
|
+### Таблица `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)
|
|
|
+);
|