Обзор базы данных stroy

Описание

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

База данных содержит сведения:

– о сотрудниках и физических лицах;

– о должностях и организационной структуре;

– о контрагентах и их адресах;

– о проектах и руководителях проектов;

– о сотрудниках, задействованных в проектах;

– о платежах по проектам;

– о типах работ, заказываемых контрагентами;

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

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

Схема данных

В проекте используется схема:


set search\_path to stroy;

Все запросы выполняются внутри схемы stroy.

Основные группы таблиц

1. География и адреса

Эти таблицы используются для определения местоположения контрагентов и сотрудников.

Таблица Назначение
country страны
city города
address адреса сотрудников и контрагентов

Связи:


country 1 ─── \* city

city 1 ─── \* address

Пример использования в проекте:

– поиск платежей от контрагентов из города Жуковский, Россия.

2. Контрагенты и виды работ

Таблицы описывают заказчиков проектов и типы работ, которые они заказывают.

Таблица Назначение
customer контрагенты
type_of_work справочник типов работ
customer_type_of_work связь контрагентов с типами работ

Связи:


customer 1 ─── \* customer\_type\_of\_work

type\_of\_work 1 ─── \* customer\_type\_of\_work

Пример использования в проекте:

– получение названий типов работ по каждому контрагенту в виде одной строки через string\_agg.

3. Сотрудники и физические лица

Эти таблицы описывают работников компании.

Таблица Назначение
person физические лица
employee сотрудники компании

Ключевая связь:


person 1 ─── 1 employee

Таблица person хранит персональные атрибуты:

– фамилию;

– имя;

– отчество;

– вычисляемое ФИО;

– дату рождения;

– телефон;

– email;

– адрес регистрации.

Таблица employee хранит кадровые данные:

– дату найма;

– дату увольнения;

– служебное описание.

Примеры использования в проекте:

– расчёт общего возраста сотрудников, нанятых в 2022 году;

– поиск сотрудника по условию на фамилию;

– расчёт среднего возраста уволенных сотрудников.

4. Организационная структура и должности

Эти таблицы описывают иерархию компании и штатное расписание.

Таблица Назначение
company_structure структурные подразделения
unit_type типы подразделений
position должности
grade_salary зарплатные вилки

Ключевые связи:


company\_structure 1 ─── \* position

unit\_type 1 ─── \* company\_structure

grade\_salary 1 ─── \* position

Таблица company\_structure содержит иерархию подразделений:

– unit\_id — идентификатор подразделения;

– parent\_id — родительское подразделение;

– unit\_name — название;

– unit\_type — тип подразделения.

Пример использования в проекте:

– рекурсивный обход подразделения с unit\_id = 17 и всех его дочерних подразделений.

5. Сотрудники, должности и оклады

Эти таблицы используются для анализа актуальных окладов и историчности назначений.

Таблица Назначение
employee_position назначение сотрудников на должности
employee_salary_history история изменения окладов

Таблица employee\_position содержит:

– сотрудника;

– должность;

– текущий оклад;

– коэффициент ставки;

– дату начала актуальности назначения.

Пример использования в проекте:

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


salary × rate

6. Проекты

Таблица project является одной из центральных в проекте.

Она хранит:

– идентификатор проекта;

– название проекта;

– контрагента;

– руководителя проекта;

– массив сотрудников, задействованных на проекте;

– стоимость проекта;

– дату подписания;

– статус проекта;

– описание.

Поле Назначение
project_id идентификатор проекта
project_name название проекта
customer_id контрагент
project_manager_id руководитель проекта
employees_id массив сотрудников проекта
project_cost стоимость проекта
sign_date дата подписания
status статус проекта

Примеры использования в проекте:

– подсчёт проектов, подписанных в 2023 году;

– определение бонуса руководителя по завершённым проектам;

– проверка, задействован ли сотрудник на проектах;

– расчёт суммы стоимости проектов по годам.

7. Платежи по проектам

Таблица project\_payment используется для анализа финансовых операций по проектам.

Она содержит:

– идентификатор платежа;

– проект;

– сумму платежа;

– тип платежа;

– планируемую дату оплаты;

– фактическую дату и время поступления оплаты.

Поле Назначение
project_payment_id идентификатор платежа
project_id проект
amount сумма платежа
payment_type тип платежа
plan_payment_date плановая дата
fact_transaction_timestamp фактическая дата и время оплаты

Примеры использования в проекте:

– сумма фактически полученных платежей;

– накопительный итог плановых авансовых платежей;

– сквозная нумерация фактических платежей по годам;

– расчёт скользящего среднего платежей;

– получение последней фактической оплаты по проекту.

Enum-типы

В базе используются перечислимые типы.

project\_status

Возможные значения:

– На подписании;

– В работе;

– Завершен;

– Отменен.

payment\_type

Возможные значения:

– Авансовый;

– Промежуточный;

– Финальный;

– Гарантийное удержание;

– Корректировка.

Примеры использования в проекте:

– фильтрация завершённых проектов по статусу Завершен;

– фильтрация авансовых платежей по типу Авансовый.

Особенности структуры БД, важные для запросов

1. Массив сотрудников в проекте

В таблице project поле employees\_id хранит массив идентификаторов сотрудников.

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


e.employee\_id = any(pr.employees\_id)

2. Иерархия подразделений

Таблица company\_structure имеет самоссылочную связь через parent\_id.

Это позволяет применять рекурсивный CTE:


with recursive units as (...)

3. Историчность окладов

Для расчёта текущих окладов используется таблица employee\_position, а не история изменений зарплаты.

В проекте важно было выбрать именно актуальный источник фактического оклада.

4. Платежи имеют плановую и фактическую даты

В таблице project\_payment отдельно хранятся:

– планируемая дата оплаты;

– фактическая дата и время поступления средств.

Это позволяет решать разные типы задач:

– анализ плановых платежей;

– анализ реально полученных денег.

Таблицы, задействованные в итоговом проекте

Таблица Использование
project проекты, руководители, стоимость, статусы
project_payment плановые и фактические платежи
employee сотрудники
person ФИО, фамилии, даты рождения
customer контрагенты
address адреса контрагентов
city города
country страны
company_structure подразделения
position должности
employee_position актуальные оклады
customer_type_of_work виды работ контрагентов
type_of_work названия видов работ