# Лабораторная работа 2. Литвинов Б23-503

## **Концептуальное проектирование базы данных**

### **Цель**

Построить логически корректную модель данных.

### **Содержание работы**

Студент разрабатывает:

* ER-диаграмму;  
* KB-диаграмму (ключи, ограничения, связи);  
* описание атрибутов и доменов;

Студент должен понимать:

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

### **Отчетные материалы**

* ER-диаграмма;  
* KB-диаграмма;  
* таблица атрибутов и доменов;

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

Операции с дочерним отношением:
- Вставка - корректное значение FK
- Удаление - без ограничений
- Модификация FK - корректное новое значение FK

Операции с родительским отношением:
- Вставка - без ограничений
- Удаление - реакция на связанные записи:
- - не удалять
- - удалить все
- - установить пустое значение (отсутствие связи)
- Модификация PK - реакция аналогична

# ER-диаграмма;  

Master и Client наследуются через отношение полной категоризации от Person / E0. Сущности, ранее связанные с обоими Master и Client теперь связаны с Person

![ER](er.drawio.svg)

# KB-диаграмма;

## Устранение неопределенных связей Many to Many

Добавлены таблицы Class_Master и Class_Equipment. Для каждого Class должно быть 2 и более записей Class_Master

## Анализ альтернативных ключей.

Client / E1
- номер телефона
- email

Master / E2
- паспорт

Studio / E3
- адрес

![KB](kb.drawio.svg)

# таблица атрибутов и доменов;

## Person / E0

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| ФИО | text | |

## Client / E1

| Атрибут | Домен | Ограничения |
|-|-|-|
| phone | text | UNIQUE |
| email | text | UNIQUE |
| billing_account | text | |

## Master / E2

| Атрибут | Домен | Ограничения |
|-|-|-|
| passport | text | UNIQUE |
| readme | text | |

## Studio / E3

| Атрибут | Домен | Ограничения |
|-|-|-|
| address | text | UNIQUE |
| capacity | int | CHECK (capacity > 0) |
| begin_date | timestamptz | |
| duration | interval | |

## Class / E4

| Атрибут | Домен | Ограничения |
|-|-|-|
| begin_date | timestamptz | PRIMARY KEY |
| Course_id | int | PRIMARY FOREIGN KEY (Course_id) REFERENCES Course (id) |
| Studio_id | int | FOREIGN KEY (Studio_id) REFERENCES Studio (id) |
| name | text | |
| type | int | |
| duration | interval | |

## Course / E5

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| Master_id | int | FOREIGN KEY (Master_id) REFERENCES Master (id) |
| name | text | |
| duration | interval | |

## Registration / E6

| Атрибут | Домен | Ограничения |
|-|-|-|
| Client_id | int | PRIMARY FOREIGN KEY (Client_id) REFERENCES Client (id) |
| Course_id | int | PRIMARY FOREIGN KEY (Course_id) REFERENCES Course (id) |
| date | timestamptz | |
| status | int | |

## FoodProduct / E7

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| FoodProductEnum_id | int | PRIMARY FOREIGN KEY (FoodProductEnum_id) REFERENCES FoodProductEnum (id) |
| ClassId | int | FOREIGN KEY (Class_id) REFERENCES Class (id) |
| buy_price | real | |
| buy_date | timestamptz | |
| delivery_price | real | |
| delivery_date | timestamptz | |
| expires_date | timestamptz | |

## Equipment / E8

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| Studio_id | int | FOREIGN KEY (Studio_id) REFERENCES Studio (id) |
| name | text | |
| usage_price | real | |
| usage_type | int | |
| delivery_price | real | |
| delivery_date | timestamptz | |

## FirstAidKit / E9

| Атрибут | Домен | Ограничения |
|-|-|-|
| Course_id | int | FOREIGN KEY (Course_id) REFERENCES Course (id) |

## Drug / E10

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| DrugEnum_id | int | PRIMARY FOREIGN KEY |
| FirstAidKit_id | int | FOREIGN KEY |
| buy_price | real | |
| buy_date | timestamptz | |
| delivery_price | real | |
| delivery_date | timestamptz | |
| expires_date | timestamptz | |

## DrugIntolerance / E11

| Атрибут | Домен | Ограничения |
|-|-|-|
| Person_id | int | PRIMARY FOREIGN KEY |
| DrugEnum_id | int | PRIMARY FOREIGN KEY |

## DrugEnum / E12

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| name | text | |
| avg_price | text | |

## FoodProductEnum / E13

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| name | text | |
| avg_price | text | |

## ActivityLog / E14

| Атрибут | Домен | Ограничения |
|-|-|-|
| id | int | PRIMARY KEY |
| Person_id | int | PRIMARY FOREIGN KEY |
| action | text | |

