МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Челябинский государственный университет» (ФГБОУ ВО «ЧелГУ») Институт информационных технологий Кафедра информационных технологий и экономической информатики КУРСОВАЯ РАБОТА по дисциплине «Базы и хранилища данных» Тема: «Киберспортивный клуб» Выполнил: Киров И. Д. Группа: ПИ-201 Проверил: Барабанщиков И. В. Курсовая работа защищена ____________________________________________________ дата Челябинск 2024 г. оценка Содержание Введение………………………………………………………………………………….3 I. Предметная область………………………………………………………………….4 1.1. Описание………………………………………………………………………….4 1.2. Бизнес-правила…………………………………………………………………...5 1.3. Группы пользователей и их права………………………………………………6 II. Инфологическое проектирование………………………………………………....7 2.1. Анализ предметной области. Построение диаграммы в нотации Питера Чена……………………………….7 III. Даталогическое проектирование…………………………………………………9 3.1. Переход к реляционной модели………………………………………………....9 3.2. Нормализация таблицы до 3НФ………………..................................................11 3.3 Построение окончательного вида ER-диаграммы……………………………..11 IV. Реализация БД……………………………………………………………………..12 4.1. Выбор СУБД……………...……………………………………………………..12 4.2. Создание схемы…………………………………………………………………12 4.3. Скрипты создания базы данных…………………………………….………….12 4.4. Реализация бизнес-логики……………………………………………………...13 V. Реализация безопасности………………………………………………………….14 5.1. Роли, привилегии, пользователи……………………………………………….14 VI. Заключение……………………………………………………………………........17 6.1. Вывод…………………………………………………………………………….17 VII. Список литературы……………………………………………………………....18 Приложения………………………………………………………………………….…19 Приложение №1……………………………………………………………………...19 Приложение №2……………………………………………………………………...20 Приложение №3……………………………………………………………………...21 2 Введение В современном мире, перенасыщенном информацией, эффективное хранение, обработка и анализ данных играют ключевую роль в успехе любого предприятия или исследовательского проекта. База данных — это организованная система для хранения и управления информацией. Она состоит из структур для размещения данных, а также программных компонентов, которые позволяют обрабатывать, анализировать и манипулировать этими данными. Системы управления базами данных (СУБД) предоставляют инструменты для выполнения различных операций с данными, таких как выборка, сортировка и многих других. СУБД являются критически важным элементом современных информационных систем, обеспечивая эффективное управление информационными ресурсами и их использование в рамках организаций. Данная курсовая работа посвящена разработке базы данных для киберспортивного клуба. 3 I. ПРЕДМЕТНАЯ ОБЛАСТЬ 1.1. Описание Киберспортивный (компьютерный) клуб – место, где люди могут арендовать компьютер для различных целей, но в основном с намерением игрового времяпрепровождения. Среднестатистический клуб предоставляет 20 посадочных мест со своим компьютером, на котором предустановлены лицензионный софт и игры, и девайсами. Каждый компьютер и девайсы имеют свои характеристики. Помещение может разделяться на две основных зоны – обычная и VIP. VIP-зона является закрытой и в ней находится в среднем 10 посадочных мест с более дорогими и мощными ПК и девайсами. Соответственно, одно посадочное место в обычной зоне дешевле, чем в VIP. Персонал компьютерного клуба не очень обширен, но в лучшем случае в нём должны быть: администратор-кассир, встречающий клиентов на ресепшене и осуществляющий оплату; помощник администратора, обслуживающий зал и клиентов; системный администратор, обслуживающий парк техники, сетевую инфраструктуру и в целом информационную систему клуба; охрана. Оплата и аренда места производится по определённым клубом тарифам. 4 1.2. Бизнес-правила Киберспортивный клуб будет реализовывать следующие бизнес-правила: Каждый новый клиент должен будет зарегистрироваться в системе клуба прежде, чем пользоваться услугами В клубе имеются различные тарифные пакеты аренды, различающиеся по количеству предоставляемого времени, по суточному времени и уровню (VIP или обычный) В клубе будет вестись история посещений и аренды с указанием информации о дате, времени, клиенте и посадочном месте, тарифном пакете На компьютерах будут иметься заранее предустановленные игровые клиенты с готовыми аккаунтами, на которых будут находится и добавляться лицензионные игры Клиентам запрещено использовать свои аккаунты и девайсы Клиент может арендовать только одно место в текущий момент времени 5 1.3. Группы пользователей и их права 1. Системный администратор: Полный доступ ко всем таблицам и функциям базы данных Возможность создавать, изменять и удалять таблицы, представления, процедуры и триггеры Возможность управлять пользователями и их правами доступа 2. Администратор-кассир: Возможность создавать, изменять и удалять записи в таблицах, связанных с историей посещений и арендой игровых мест Доступ на чтение и запись к таблицам, связанным с информацией о зарегистрированных клиентах 3. Администратор зала: Возможность создавать, изменять и удалять записи в таблицах, связанных с состоянием игровых (посадочных) мест Доступ на чтение и запись к таблицам, связанным с информацией о состоянии ПК и его составляющих Ограниченный доступ на чтение истории посещений клиентов 4. Охрана: Ограниченный доступ на чтение информации о пользователях и их истории посещений 6 II. ИНФОЛОГИЧЕСКОЕ ПРОЕКТИРОВАНИЕ 2.1. Анализ предметной области. Построение диаграммы в нотации Питера Чена Проанализировав предметную область и её бизнес-правила, я выделил следующие сущности, их атрибуты и связи: 1. Клиент: Атрибуты: 1. id 2. Имя 3. Фамилия 4. Отчество 5. Номер телефона 6. Дата рождения Связи: o Клиент арендует посадочное место (один-ко-одному) 2. Посадочное место: Атрибуты: 1. Id 2. Номер 3. Модель кресла 4. Модель монитора 5. Модель мыши 6. Модель клавиатуры 7. Модель наушников 8. Модель коврика Связи: Посадочное место имеет ПК (один-ко-одному) Посадочное место реализует тариф (многие-ко-многим) 3. Зал: Атрибуты: 1. Id 2. Номер 3. Тип Связи: o Зал имеет посадочное место 4. Сотрудник: Атрибуты: 1. Id 2. Имя 3. Фамилия 4. Отчество 5. Должность 6. Номер телефона 7. Дата рождения 7 Связи: o Сотрудник работает в зале 5. ПК: Атрибуты: 1. Id 2. Номер 3. Модель видеокарты 4. Модель процессора Связи: o ПК имеет аккаунты (один-ко-многим) 6. Аккаунт: Атрибуты: 1. Id 2. Логин 3. Пароль 4. Игровой клиент Связи: o Аккаунты имеют игры (многие-ко-многим) 7. Игра: Атрибуты: 1. Id 2. Название 3. Жанр Для дополнительной информации обратимся к приложению 1. 8 III. ДАТАЛОГИЧЕСКОЕ ПРОЕКТИРОВАНИЕ 3.1. Переход к реляционной модели 1. Клиенты (Clients) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | PhoneNumber | VARCHAR(20) | NOT NULL, UNIQUE | | FirstName | VARCHAR(50) | NOT NULL | | LastName | VARCHAR(50) | NOT NULL | | Patronymic | VARCHAR(50) | | | BirthDate | DATE | NOT NULL | 2. Посадочные места (Workplaces) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | HallID (FK) | INT | NOT NULL | | PCID (FK) | INT | NOT NULL | | Number | INT | NOT NULL, UNIQUE | | ChairModel | VARCHAR(50) | | | MonitorModel | VARCHAR(50) | | | MouseModel | VARCHAR(50) | | | KeyboardModel | VARCHAR(50) | | | HeadphonesModel | VARCHAR(50) | | | MatModel | VARCHAR(50) | | 3. Залы (Halls) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | Number | INT | NOT NULL, UNIQUE | | Type | VARCHAR(50) | NOT NULL | 4. Сотрудники (Employees) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | PhoneNumber | VARCHAR(20) | NOT NULL, UNIQUE | | FirstName | VARCHAR(50) | NOT NULL | | LastName | VARCHAR(50) | NOT NULL | | Patronymic | VARCHAR(50) | | | BirthDate | DATE | NOT NULL | | Position | VARCHAR(50) | NOT NULL | 5. ПК (PCs) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | Number | INT | NOT NULL, UNIQUE | 9 | GPUModel | VARCHAR(50) | NOT NULL | | CPUModel | VARCHAR(50) | NOT NULL | 6. Тарифы (Tariffs) | Колонка | Тип данных | Ограничения | | ID (PK) | INT | IDENTITY, NOT NULL | | Name | VARCHAR(50) | NOT NULL, UNIQUE | | Cost | MONEY | NOT NULL | | NumberOfHours | INT| NOT NULL | | ForAdult | BOOLEAN | NOT NULL | 7. Аккаунты (Accounts) | Колонка | Тип данных | Ограничения | ID (PK) | INT | IDENTITY, NOT NULL | | Login | VARCHAR(50) | NOT NULL, UNIQUE | | PasswordHash | VARCHAR(255) | NOT NULL | | GameClient | VARCHAR(50) | | | PCID (FK) | INT | NOT NULL | 8. Игры (Games) | Колонка | Тип данных | Ограничения | ID (PK) | INT | IDENTITY, NOT NULL | | Name | VARCHAR(100) | NOT NULL, UNIQUE | | Genre | VARCHAR(50) | NOT NULL | Связывающие таблицы: 9. Клиенты - Посадочные места (ClientsWorkplaces) | Колонка | Тип данных | Ограничения | | ClientID (PK, FK) | INT | NOT NULL | | WorkplaceID (PK, FK) | INT | NOT NULL | | TarrifID (FK) | INT | NOT NULL | | Time | Time | NOT NULL | | Date | Date | NOT NULL | 10. Посадочные места - Тарифы (WorkplacesTariffs) | Колонка | Тип данных | Ограничения | | WorkplaceID (PK, FK) | INT | NOT NULL | | TariffID (PK, FK) | INT | NOT NULL | 11. Сотрудники - Залы (EmployeesHalls) | Колонка | Тип данных | Ограничения | | EmployeeID (PK, FK) | INT | NOT NULL | | HallID (PK, FK) | INT | NOT NULL | 12. Аккаунты - Игры (AccountsGames) | Колонка | Тип данных | Ограничения | | AccountID (PK, FK) | INT | NOT NULL | | GameID (PK, FK) | INT | NOT NULL | 10 Ограничения целостности: * PK - Первичный ключ * FK - Внешний ключ * IDENTITY - Автоинкремент * NOT NULL - Не может быть пустым * UNIQUE - Уникальное значение 11 3.2. Нормализация таблиц до 3НФ Нормализация: * 1НФ: Все атрибуты атомарны (неделимы). * 2НФ: выполняется 1НФ, и все неключевые атрибуты зависят от всего первичного ключа (нет частичной зависимости). * 3НФ: выполняется 2НФ, и нет транзитивных зависимостей (неключевые атрибуты не зависят друг от друга). Даталогическая модель соответствует требованиям 1НФ, 2НФ и 3НФ. Связи, не поддерживаемые реляционной моделью: Реляционная модель не поддерживает связи "один-ко-одному" в чистом виде. В данной модели такие связи реализованы с помощью внешних ключей: * Клиент - Посадочное место (один-ко-одному) - реализовано через таблицу ClientsWorkplaces * Посадочное место - ПК (один-ко-одному) - реализовано через внешний ключ PCID в таблице Workplaces 3.3. Построение окончательного вида ER-диаграммы Для построения окончательного вида ER-диаграммы был использован инструмент Draw.IO. Чтобы с ней ознакомиться, обратимся к приложению 2. 12 РЕАЛИЗАЦИЯ БД IV. Выбор СУБД 4.1. В рамках курсовой работы была выбрана мощная и надежная PostgreSQL, как основная система управления базами данных. Для удобного управления базами данных PostgreSQL был использован графический инструмент pgAdmin 4. pgAdmin 4 предоставляет удобный интерфейс для администрирования PostgreSQL, позволяя выполнять различные задачи, такие как создание и изменение таблиц, написание и выполнение SQL-запросов, мониторинг баз данных и многое другое. 4.2. Создания схемы В рамках курсовой работы для создания и управления схемой базы данных использовался привилегированный пользователь "system_administrator". Этому пользователю предоставлен полный доступ ко всем таблицам и командам в СУБД, включая права на создание, модификацию и удаление объектов базы данных. Однако, для обеспечения безопасности данных рекомендуется создавать отдельных пользователей с минимально необходимыми привилегиями и проявлять осторожность при выполнении операций. Регулярное резервное копирование базы данных также является важной мерой предосторожности. Пользователь "system_administrator" должен использоваться исключительно для административных задач, и доступ к нему должен быть предоставлен только компетентным специалистам. 4.3. Скрипты создания базы данных Все скрипты по созданию таблиц, ролей, функций/процедур находятся в приложении 3. 13 4.4. Реализация бизнес-логики Процедура №1. register_client(id integer, first_name character varying(50), patronymic character varying(50), last_name character varying(50), birth_date date, phone_number character varying(20)) Данная процедура предназначена для администратора-кассира, чтобы регистрировать новых клиентов, при этом происходит проверка уникальности номера телефона, и создать второго пользователя с одним и тем же номером не выйдет. Процедура №2. add_new_pc (id integer, number integer, gpu_model character varying(50), cpu_model character varying(50)) Данная процедура позволяет администратору зала добавлять новые ПК. Функция №1. get_client_info(phone_number character varying(20)) Данная функция предназначена для администратора-кассира и возвращает из базы данных информацию о зарегистрированном клиенте по номеру телефона. Представление №1. сlients_rentals Данное представление предназначено для охранника и администратора-кассира, которое возвращает из базы данных информацию о истории посещения клиентов. На самом деле можно реализовать огромное множество различных процедур/функций. Но на данный момент реализованы самые необходимые. 14 V. РЕАЛИЗАЦИЯ БЕЗОПАСНОСТИ 5.1. Роли, привилегии, пользователи База данных имеет следующих пользователей: 1. Администратор-кассир 2. Администратор зала 3. Системный администратор 4. Охрана Соответственно реализуются следующие роли с привилегиями: 1. Роль “system_administrator”: имеет привилегии суперпользователя, отвечает за всю базу данных (делегирование процедур/функций, все CRUD операции): CREATE ROLE system_administrator WITH LOGIN SUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION BYPASSRLS 2. Роль “administrator-cashier”: обычный пользователь, имеющий ограниченный доступ доступ на чтение и добавление данных в таблицах, связанных с клиентами, посещениями и т. п, а также может выполнять процедуру register_client и функцию get_client_info: CREATE ROLE administrator_cashier WITH LOGIN 15 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS 3. Роль “hall_administrator”: обычный пользователь имеющий ограниченный доступ на чтение и добавление данных в таблицах, связанных с залами, компами, играми и аккаунтами, может выполнять процедуру add_new_pc: CREATE ROLE hall_administrator WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS; 4. Роль “security”: самый ограниченный в плане привилегий пользователь. Имеет доступ на просмотр представления clients_rentals: CREATE ROLE security WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION 16 NOBYPASSRLS; Подробнее о правах доступа можно посмотреть в приложении 3 в скриптах создания таблиц. 17 VI. ЗАКЛЮЧЕНИЕ Вывод 6.1. В рамках данной курсовой работы разработана база данных для киберспортивного клуба. Процесс разработки включал в себя следующие этапы: 1. Анализ предметной области: Выявлены информационные потребности киберспортивного клуба и определены ключевые сущности и их атрибуты. 2. Проектирование структуры базы данных: на основе анализа предметной области разработана даталогическая модель базы данных, включающая в себя таблицы для хранения информации о клиентах, компьютерах, посадочных местах и сотрудниках. Установлены связи между таблицами для обеспечения целостности и эффективности хранения данных. 3. Реализация базы данных: в качестве системы управления базами данных (СУБД) выбрана PostgreSQL. Созданы таблицы базы данных в соответствии с разработанной даталогической моделью и заполнены тестовыми данными. 4. Разработка процедур: для автоматизации операций и обеспечения целостности данных разработан набор хранимых процедур, упрощающих выполнение типовых задач и гарантирующих корректность данных. 5. Обеспечение безопасности: для разграничения доступа к данным определены роли пользователей с соответствующими привилегиями. Это позволяет обеспечить безопасность данных и контролировать доступ к конфиденциальной информации. В результате создана база данных, обладающая базовым функционалом для управления информацией киберспортивного клуба. Разработанное решение обеспечивает надежное хранение данных и предоставляет инструменты для эффективного выполнения операций в рамках заданной предметной области. 18 VII. СПИСОК ЛИТЕРАТУРЫ 1. Нормализация таблиц. https://chelyabinsk.1cbit.ru/blog/chto-takoe-normalizatsiya 2. PostgreSQL: Documentation: 15: 43.2. Структура PL/SQL. https://repo.postgrespro.ru/doc//pgsql/15.6 3. PostgreSQL: Documentation: 15: Create role https://www.postgresql.org/docs/15/sql-createrole 19 ПРИЛОЖЕНИЯ Приложение №1. Диаграмма в нотации Питера Чена 20 Приложение №2. Реляционная ER-диаграмма 21 Приложение №3. Скрипты базы данных Сама база данных: CREATE DATABASE cyber_club WITH OWNER = system_administrator ENCODING = 'UTF8' LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' LOCALE_PROVIDER = 'libc' TABLESPACE = pg_default CONNECTION LIMIT = -1 IS_TEMPLATE = False; 22 Процедура register_client: CREATE OR REPLACE PROCEDURE public.register_client( IN id integer, IN first_name character varying, IN patronymic character varying, IN last_name character varying, IN birth_date date, IN phone_number character varying) LANGUAGE 'plpgsql' AS $BODY$ BEGIN IF EXISTS (SELECT 1 FROM clients WHERE clients.phone_number = register_client.phone_number) THEN RAISE EXCEPTION 'Клиент с таким номером телефона уже существует.'; END IF; INSERT INTO clients (id, first_name, patronymic, last_name, birth_date, phone_number) VALUES (register_client.id, register_client.first_name, register_client.patronymic, register_client.last_name, register_client.birth_date, register_client.phone_number); END; $BODY$; ALTER PROCEDURE public.register_client(integer, character varying, character varying, character varying, date, character varying) OWNER TO system_administrator; 23 Процедура add_new_pc: CREATE OR REPLACE PROCEDURE public.add_new_pc( IN id integer, IN number integer, IN gpu_model character varying, IN cpu_model character varying) LANGUAGE 'plpgsql' AS $BODY$ BEGIN INSERT INTO PCs (pcs.id, pcs.number, pcs.gpu_model, cpu_model) VALUES (add_new_pc.id, add_new_pc.number, add_new_pc.gpu_model, add_new_pc.cpu_model); END; $BODY$; ALTER PROCEDURE public.add_new_pc(integer, integer, character varying, character varying) OWNER TO evan; GRANT EXECUTE ON PROCEDURE public.add_new_pc(integer, integer, character varying, character varying) TO PUBLIC; GRANT EXECUTE ON PROCEDURE public.add_new_pc(integer, integer, character varying, character varying) TO hall_administrator; GRANT EXECUTE ON PROCEDURE public.add_new_pc(integer, integer, character varying, character varying) TO system_administrator WITH GRANT OPTION; 24 Функция get_client_info: CREATE OR REPLACE FUNCTION public.get_client_info( client_id integer) RETURNS TABLE(id integer, first_name character varying, patronymic character varying, last_name character varying, birth_date date, phone_number character varying) LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE ROWS 1000 AS $BODY$ BEGIN RETURN QUERY SELECT * FROM clients WHERE clients.id = get_client_info.client_id; END; $BODY$; ALTER FUNCTION public.get_client_info(integer) OWNER TO system_administrator; GRANT EXECUTE ON FUNCTION public.get_client_info(integer) TO PUBLIC; GRANT EXECUTE ON FUNCTION public.get_client_info(integer) TO administrator_cashier; GRANT EXECUTE ON FUNCTION public.get_client_info(integer) TO system_administrator WITH GRANT OPTION; 25 Представление clients_rents: CREATE OR REPLACE VIEW public.clients_rentals AS SELECT c.first_name, c.last_name, c.patronymic, c.phone_number, cw.date AS rentaldate, cw."time" AS rentaltime FROM clients c JOIN clients_workplaces cw ON c.id = cw.client_id; ALTER TABLE public.clients_rentals OWNER TO system_administrator; 26 Таблица accounts: CREATE TABLE IF NOT EXISTS public.accounts ( id integer NOT NULL, login character varying(50) COLLATE pg_catalog."default" NOT NULL, password_hash character varying(50) COLLATE pg_catalog."default" NOT NULL, game_client character varying(50) COLLATE pg_catalog."default" NOT NULL, pc_id integer NOT NULL, CONSTRAINT accounts_pkey PRIMARY KEY (id), CONSTRAINT accounts_login_game_client_key UNIQUE (login) INCLUDE(game_client), CONSTRAINT accounts_pc_id_fkey FOREIGN KEY (pc_id) REFERENCES public.pcs (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.accounts OWNER to system_administrator; GRANT ALL ON TABLE public.accounts TO system_administrator WITH GRANT OPTION; 27 Таблица accounts_games: CREATE TABLE IF NOT EXISTS public.accounts_games ( account_id integer NOT NULL, game_id integer NOT NULL, CONSTRAINT accounts_games_pkey PRIMARY KEY (account_id, game_id), CONSTRAINT accounts_games_game_id_fkey FOREIGN KEY (game_id) REFERENCES public.games (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION NOT VALID ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.accounts_games OWNER to system_administrator; REVOKE ALL ON TABLE public.accounts_games FROM administrator_cashier; REVOKE ALL ON TABLE public.accounts_games FROM hall_administrator; GRANT SELECT ON TABLE public.accounts_games TO administrator_cashier; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.accounts_games TO hall_administrator; GRANT ALL ON TABLE public.accounts_games TO system_administrator WITH GRANT OPTION; Таблица clients: CREATE TABLE IF NOT EXISTS public.clients ( 28 id integer NOT NULL, first_name character varying(50) COLLATE pg_catalog."default" NOT NULL, patronymic character varying(50) COLLATE pg_catalog."default", last_name character varying(50) COLLATE pg_catalog."default" NOT NULL, birth_date date NOT NULL, phone_number character varying(20) COLLATE pg_catalog."default" NOT NULL, CONSTRAINT clients_pkey PRIMARY KEY (id), CONSTRAINT clients_phone_number_key UNIQUE (phone_number) ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.clients OWNER to system_administrator; REVOKE ALL ON TABLE public.clients FROM administrator_cashier; REVOKE ALL ON TABLE public.clients FROM security; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.clients TO administrator_cashier; GRANT SELECT ON TABLE public.clients TO security; GRANT ALL ON TABLE public.clients TO system_administrator WITH GRANT OPTION; Таблица clients_workplaces: CREATE TABLE IF NOT EXISTS public.clients_workplaces ( 29 workplace_id integer NOT NULL, client_id integer NOT NULL, tariff_id integer NOT NULL, "time" time without time zone NOT NULL, date date NOT NULL, CONSTRAINT clients_workplaces_pkey PRIMARY KEY (workplace_id, client_id), CONSTRAINT clients_workplaces_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.clients (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT clients_workplaces_tarrif_id_fkey FOREIGN KEY (tariff_id) REFERENCES public.workplaces_tariffs (tariff_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION NOT VALID ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.clients_workplaces OWNER to system_administrator; REVOKE ALL ON TABLE public.clients_workplaces FROM administrator_cashier; REVOKE ALL ON TABLE public.clients_workplaces FROM hall_administrator; REVOKE ALL ON TABLE public.clients_workplaces FROM security; GRANT INSERT, SELECT ON TABLE public.clients_workplaces TO administrator_cashier; GRANT SELECT ON TABLE public.clients_workplaces TO hall_administrator; 30 GRANT SELECT ON TABLE public.clients_workplaces TO security; GRANT ALL ON TABLE public.clients_workplaces TO system_administrator WITH GRANT OPTION; Таблица employees: CREATE TABLE IF NOT EXISTS public.employees 31 ( id integer NOT NULL, first_name character varying(50) COLLATE pg_catalog."default" NOT NULL, patronymic character varying(50) COLLATE pg_catalog."default", last_name character varying(50) COLLATE pg_catalog."default" NOT NULL, "position" character varying(50) COLLATE pg_catalog."default" NOT NULL, phone_number character varying(20) COLLATE pg_catalog."default" NOT NULL, birth_date date NOT NULL, CONSTRAINT employees_pkey PRIMARY KEY (id), CONSTRAINT employees_phone_number_key UNIQUE (phone_number) ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.employees OWNER to system_administrator; GRANT ALL ON TABLE public.employees TO system_administrator WITH GRANT OPTION; Таблица employees_halls: 32 CREATE TABLE IF NOT EXISTS public.employees_halls ( hall_id integer NOT NULL, employee_id integer NOT NULL, CONSTRAINT employees_halls_pkey PRIMARY KEY (hall_id, employee_id), CONSTRAINT employees_halls_hall_id_fkey FOREIGN KEY (hall_id) REFERENCES public.halls (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION NOT VALID ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.employees_halls OWNER to system_administrator; GRANT ALL ON TABLE public.employees_halls TO system_administrator WITH GRANT OPTION; 33 Таблица games: CREATE TABLE IF NOT EXISTS public.games ( id integer NOT NULL, title character varying(100) COLLATE pg_catalog."default" NOT NULL, genre character varying(50) COLLATE pg_catalog."default" NOT NULL, CONSTRAINT games_pkey PRIMARY KEY (id), CONSTRAINT games_title_key UNIQUE (title) ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.games OWNER to system_administrator; REVOKE ALL ON TABLE public.games FROM administrator_cashier; REVOKE ALL ON TABLE public.games FROM hall_administrator; GRANT SELECT ON TABLE public.games TO administrator_cashier; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.games TO hall_administrator; GRANT ALL ON TABLE public.games TO system_administrator WITH GRANT OPTION; 34 Таблица halls: CREATE TABLE IF NOT EXISTS public.halls ( id integer NOT NULL, "number" integer NOT NULL, type character varying(50) COLLATE pg_catalog."default" NOT NULL, CONSTRAINT "Halls_pkey" PRIMARY KEY (id), CONSTRAINT "Halls_number_key" UNIQUE ("number") ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.halls OWNER to system_administrator; REVOKE ALL ON TABLE public.halls FROM administrator_cashier; REVOKE ALL ON TABLE public.halls FROM hall_administrator; GRANT SELECT ON TABLE public.halls TO administrator_cashier; GRANT SELECT, UPDATE ON TABLE public.halls TO hall_administrator; GRANT ALL ON TABLE public.halls TO system_administrator WITH GRANT OPTION; 35 Таблица pcs: CREATE TABLE IF NOT EXISTS public.pcs ( id integer NOT NULL, "number" integer NOT NULL, gpu_model character varying(50) COLLATE pg_catalog."default" NOT NULL, cpu_model character varying(50) COLLATE pg_catalog."default" NOT NULL, CONSTRAINT pcs_pkey PRIMARY KEY (id), CONSTRAINT pcs_number_key UNIQUE ("number") ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.pcs OWNER to system_administrator; REVOKE ALL ON TABLE public.pcs FROM administrator_cashier; REVOKE ALL ON TABLE public.pcs FROM hall_administrator; GRANT SELECT ON TABLE public.pcs TO administrator_cashier; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.pcs TO hall_administrator; GRANT ALL ON TABLE public.pcs TO system_administrator WITH GRANT OPTION; 36 Таблица tariffs: CREATE TABLE IF NOT EXISTS public.tariffs ( id integer NOT NULL, name character varying(50) COLLATE pg_catalog."default" NOT NULL, cost money NOT NULL, number_of_hours integer NOT NULL, for_adult boolean NOT NULL, CONSTRAINT tarrifs_pkey PRIMARY KEY (id) ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.tariffs OWNER to system_administrator; REVOKE ALL ON TABLE public.tariffs FROM hall_administrator; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.tariffs TO hall_administrator; GRANT ALL ON TABLE public.tariffs TO system_administrator WITH GRANT OPTION; Таблица workplaces: CREATE TABLE IF NOT EXISTS public.workplaces ( id integer NOT NULL, pc_id integer NOT NULL, 37 "number" integer NOT NULL, chair_model character varying(50) COLLATE pg_catalog."default" NOT NULL, monitor_model character varying(50) COLLATE pg_catalog."default" NOT NULL, mouse_model character varying(50) COLLATE pg_catalog."default" NOT NULL, keyboard_model character varying(50) COLLATE pg_catalog."default" NOT NULL, headphones_model character varying(50) COLLATE pg_catalog."default" NOT NULL, mat_model character varying(50) COLLATE pg_catalog."default" NOT NULL, hall_id integer NOT NULL, CONSTRAINT workplaces_pkey PRIMARY KEY (id), CONSTRAINT workplaces_number_key UNIQUE ("number"), CONSTRAINT workplaces_hall_id_fkey FOREIGN KEY (hall_id) REFERENCES public.halls (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION NOT VALID, CONSTRAINT workplaces_pc_id_fkey FOREIGN KEY (pc_id) REFERENCES public.pcs (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.workplaces OWNER to system_administrator; REVOKE ALL ON TABLE public.workplaces FROM administrator_cashier; REVOKE ALL ON TABLE public.workplaces FROM hall_administrator; 38 GRANT SELECT ON TABLE public.workplaces TO administrator_cashier; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.workplaces TO hall_administrator; GRANT ALL ON TABLE public.workplaces TO system_administrator WITH GRANT OPTION; Таблица workplaces_tariffs: CREATE TABLE IF NOT EXISTS public.workplaces_tariffs ( workplace_id integer NOT NULL, tariff_id integer NOT NULL, 39 CONSTRAINT workplaces_tarrifs_pkey PRIMARY KEY (workplace_id, tariff_id), CONSTRAINT workplaces_tarrifs_tarrif_id_workplace_id_key UNIQUE (tariff_id) INCLUDE(workplace_id), CONSTRAINT workplaces_tarrifs_tarrif_id_fkey FOREIGN KEY (tariff_id) REFERENCES public.tariffs (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.workplaces_tariffs OWNER to system_administrator; REVOKE ALL ON TABLE public.workplaces_tariffs FROM administrator_cashier; REVOKE ALL ON TABLE public.workplaces_tariffs FROM hall_administrator; GRANT DELETE, INSERT, SELECT, UPDATE ON TABLE public.workplaces_tariffs TO administrator_cashier; GRANT SELECT ON TABLE public.workplaces_tariffs TO hall_administrator; GRANT ALL ON TABLE public.workplaces_tariffs TO system_administrator WITH GRANT OPTION; 40