4 deleted inheritance, course deadline_date
This commit is contained in:
23
4/data.js
23
4/data.js
@ -150,9 +150,9 @@ const ClassTypes = ['Theory', 'Practice']
|
|||||||
const RegistrationStatuses = ['NotPaid', 'Paid']
|
const RegistrationStatuses = ['NotPaid', 'Paid']
|
||||||
const EquipmentUsageTypes = ['PayOnce', 'PayMonthly']
|
const EquipmentUsageTypes = ['PayOnce', 'PayMonthly']
|
||||||
|
|
||||||
function Values(callback) {
|
function Values(callback, factor = 1) {
|
||||||
let res = 'VALUES\n'
|
let res = 'VALUES\n'
|
||||||
const count = 5
|
const count = 5 * factor
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
res += callback()
|
res += callback()
|
||||||
@ -167,14 +167,21 @@ function Values(callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Person
|
||||||
|
let script = 'INSERT INTO "Person" (full_name, passwd_hash) ' + Values(() => {
|
||||||
|
return `(${GenFullName()}, ${GenPasswdHash()})`
|
||||||
|
}, 2)
|
||||||
|
|
||||||
|
let person_id = 1
|
||||||
|
|
||||||
// Master
|
// Master
|
||||||
let script = 'INSERT INTO "Master" (full_name, passwd_hash, passport, readme) ' + Values(() => {
|
script += 'INSERT INTO "Master" ("Person_id", passport, readme) ' + Values(() => {
|
||||||
return `(${GenFullName()}, ${GenPasswdHash()}, ${GenPassport()}, 'aboba')`
|
return `(${person_id++}, ${GenPassport()}, 'aboba')`
|
||||||
})
|
})
|
||||||
|
|
||||||
// Client
|
// Client
|
||||||
script += 'INSERT INTO "Client" (full_name, passwd_hash, phone, email, billing_account) ' + Values(() => {
|
script += 'INSERT INTO "Client" ("Person_id", phone, email, billing_account) ' + Values(() => {
|
||||||
return `(${GenFullName()}, ${GenPasswdHash()}, ${GenPassport()}, ${GenPhone()}, ${GenBillingAccount()})`
|
return `(${person_id++}, ${GenPhone()}, ${GenEmail()}, ${GenBillingAccount()})`
|
||||||
})
|
})
|
||||||
|
|
||||||
// Studio
|
// Studio
|
||||||
@ -183,8 +190,8 @@ script += 'INSERT INTO "Studio" (address, capacity, begin_date, duration) ' + Va
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Course
|
// Course
|
||||||
script += 'INSERT INTO "Course" ("Master_id", name, price, duration) ' + Values(() => {
|
script += 'INSERT INTO "Course" ("Master_id", name, price, deadline_date) ' + Values(() => {
|
||||||
return `(${GenInt(1, 6)}, 'курс ${GenMaxUInt(100)}', ${GenPrice()}, ${GenIntervalHours(20)})`
|
return `(${GenInt(1, 6)}, 'курс ${GenMaxUInt(3)}', ${GenPrice()}, ${GenTimestamp()})`
|
||||||
})
|
})
|
||||||
|
|
||||||
// Class
|
// Class
|
||||||
|
|||||||
37
4/schema.sql
37
4/schema.sql
@ -1,39 +1,40 @@
|
|||||||
DROP TABLE IF EXISTS "Person" CASCADE;
|
DROP TABLE IF EXISTS "Person", "Client", "Master", "Studio", "Course", "Class", "Class_Master", "Registration", "FoodProductEnum", "FoodProduct", "Equipment", "Class_Equipment", "DrugEnum", "Drug", "DrugIntolerance", "ActivityLog";
|
||||||
DROP SEQUENCE IF EXISTS "PersonId";
|
|
||||||
|
|
||||||
|
DROP TYPE IF EXISTS "ClassType", "RegistrationStatus", "EquipmentUsageType";
|
||||||
CREATE SEQUENCE "PersonId";
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE "Person" (
|
CREATE TABLE "Person" (
|
||||||
id int PRIMARY KEY DEFAULT nextval('"PersonId"'),
|
id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
full_name text NOT NULL,
|
full_name text NOT NULL,
|
||||||
passwd_hash bytea NOT NULL
|
passwd_hash bytea NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE "Client" (
|
CREATE TABLE "Client" (
|
||||||
|
"Person_id" int UNIQUE NOT NULL,
|
||||||
|
|
||||||
phone text NOT NULL,
|
phone text NOT NULL,
|
||||||
email text NOT NULL,
|
email text NOT NULL,
|
||||||
billing_account text NOT NULL,
|
billing_account text NOT NULL,
|
||||||
|
|
||||||
PRIMARY KEY (id)
|
FOREIGN KEY ("Person_id") REFERENCES "Person" (id)
|
||||||
) INHERITS ("Person");
|
ON DELETE CASCADE
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE "Master" (
|
CREATE TABLE "Master" (
|
||||||
|
"Person_id" int UNIQUE NOT NULL,
|
||||||
|
|
||||||
passport text UNIQUE NOT NULL,
|
passport text UNIQUE NOT NULL,
|
||||||
readme text NOT NULL,
|
readme text NOT NULL,
|
||||||
|
|
||||||
PRIMARY KEY (id)
|
FOREIGN KEY ("Person_id") REFERENCES "Person" (id)
|
||||||
) INHERITS ("Person");
|
ON DELETE CASCADE
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS "Studio", "Course", "Class", "Class_Master", "Registration", "FoodProductEnum", "FoodProduct", "Equipment", "Class_Equipment", "DrugEnum", "Drug", "DrugIntolerance", "ActivityLog";
|
|
||||||
|
|
||||||
|
|
||||||
DROP TYPE IF EXISTS "ClassType", "RegistrationStatus", "EquipmentUsageType";
|
|
||||||
|
|
||||||
CREATE TABLE "Studio" (
|
CREATE TABLE "Studio" (
|
||||||
id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
address text UNIQUE NOT NULL,
|
address text UNIQUE NOT NULL,
|
||||||
@ -48,9 +49,9 @@ CREATE TABLE "Course" (
|
|||||||
"Master_id" int,
|
"Master_id" int,
|
||||||
name text NOT NULL,
|
name text NOT NULL,
|
||||||
price real NOT NULL CHECK (price > 0),
|
price real NOT NULL CHECK (price > 0),
|
||||||
duration interval NOT NULL,
|
deadline_date timestamptz NOT NULL,
|
||||||
|
|
||||||
FOREIGN KEY ("Master_id") REFERENCES "Master" (id)
|
FOREIGN KEY ("Master_id") REFERENCES "Master" ("Person_id")
|
||||||
ON DELETE SET NULL
|
ON DELETE SET NULL
|
||||||
ON UPDATE CASCADE
|
ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
@ -89,7 +90,7 @@ CREATE TABLE "Class_Master" (
|
|||||||
|
|
||||||
PRIMARY KEY ("Class_begin_date", "Class_Course_id", "Master_id"),
|
PRIMARY KEY ("Class_begin_date", "Class_Course_id", "Master_id"),
|
||||||
|
|
||||||
FOREIGN KEY ("Master_id") REFERENCES "Master" (id)
|
FOREIGN KEY ("Master_id") REFERENCES "Master" ("Person_id")
|
||||||
ON DELETE CASCADE
|
ON DELETE CASCADE
|
||||||
ON UPDATE CASCADE,
|
ON UPDATE CASCADE,
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ CREATE TABLE "Registration" (
|
|||||||
|
|
||||||
PRIMARY KEY ("Client_id", "Course_id"),
|
PRIMARY KEY ("Client_id", "Course_id"),
|
||||||
|
|
||||||
FOREIGN KEY ("Client_id") REFERENCES "Client" (id)
|
FOREIGN KEY ("Client_id") REFERENCES "Client" ("Person_id")
|
||||||
ON DELETE CASCADE
|
ON DELETE CASCADE
|
||||||
ON UPDATE CASCADE,
|
ON UPDATE CASCADE,
|
||||||
|
|
||||||
|
|||||||
30
регламент.md
30
регламент.md
@ -37,36 +37,6 @@
|
|||||||
* **Текстовое описание работы не подразумевается, только фиксация результата**
|
* **Текстовое описание работы не подразумевается, только фиксация результата**
|
||||||
* устная защита на лабораторной работе.
|
* устная защита на лабораторной работе.
|
||||||
|
|
||||||
## Лабораторная работа 5
|
|
||||||
|
|
||||||
**Аналитические SQL-запросы**
|
|
||||||
|
|
||||||
**Срок выполнения: 2 недели**
|
|
||||||
|
|
||||||
### **Цель**
|
|
||||||
|
|
||||||
Освоить сложные запросы и аналитические возможности SQL.
|
|
||||||
|
|
||||||
### **Обязательные требования к запросам**
|
|
||||||
|
|
||||||
Все запросы должны:
|
|
||||||
|
|
||||||
* использовать CTE;
|
|
||||||
* возвращать расширенный набор данных (не менее 7 строк вывода).
|
|
||||||
|
|
||||||
### **Необходимо реализовать 5 запросов, среди которые должны использоваться:**
|
|
||||||
|
|
||||||
1. Сложный JOIN (3+ таблиц) с фильтрами и HAVING.
|
|
||||||
2. Поиск отсутствующих данных (LEFT JOIN \+ IS NULL).
|
|
||||||
3. Оконная функция с `ROWS BETWEEN`.
|
|
||||||
4. Оконная функция смещения (`LAG` / `LEAD`).
|
|
||||||
|
|
||||||
### **Отчетные материалы**
|
|
||||||
|
|
||||||
* SQL-код запросов;
|
|
||||||
* примеры выполнения;
|
|
||||||
краткое описание логики каждого запроса.
|
|
||||||
|
|
||||||
## Лабораторная работа 6
|
## Лабораторная работа 6
|
||||||
|
|
||||||
**Триггеры и хранимые процедуры**
|
**Триггеры и хранимые процедуры**
|
||||||
|
|||||||
Reference in New Issue
Block a user