ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 461
Скачиваний: 17
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Задание 1. Разработка модели предметной области Разработать формальную модель предметной области для небольшой строительной фирмы, которая занимается ремонтом помещений. При выполнении проектов в фирме используются детали, закупаемые у поставщиков.Модель и описание предметной областиРисунок 1 – Модель строительной фирмы, занимающейся ремонтом помещений и закупающей детали у поставщиковДеталь имеет следующие атрибуты: уникальный идентификатор, название, цена, цвет, вес. Поставщик имеет следующие атрибуты: уникальный идентификатор, название, город, адрес, рейтинг.Поставка детали для проекта имеет атрибут количество деталей, ID проекта, детали и поставщика.Проект имеет следующие атрибуты: уникальный идентификатор, название, город, адрес, бюджет.Деталь может поставляться различными поставщиками для различных проектов. Например, могут одновременно существовать следующие поставки: поставка детали «Гвоздь 50 мм» от поставщика «Стройкомплект» для проекта «Ремонт квартиры» и поставка детали «Гвоздь 50 мм» от поставщика «РемСнабСбыт» для проекта «Ремонт садового домика».Поставщик может поставлять различные детали для различных проектов. Например, могут одновременно существовать следующие поставки: поставка детали «Гвоздь 50 мм» от поставщика «Стройкомплект» для проекта «Ремонт квартиры» и поставка детали «Вагонка 5 м» от поставщика «Стройкомплект» для проекта «Ремонт садового домика».В проекте могут использоваться различные детали, поставленные различными поставщиками. Например, могут одновременно существовать следующие поставки: поставка детали «Гвоздь 50 мм» от поставщика «Стройкомплект» для проекта «Ремонт квартиры» и поставка детали «Саморез 50 мм» от поставщика «РемСнабСбыт» для проекта «Ремонт квартиры».Задание 2-3. Разработка схемы базы данных и ограничений целостности1) Разработка схемы базы данныхРазработать схему базы данных в виде ER-диаграммы (допустима любая нотация). Убедиться, что разработанная диаграмма адекватно и полно отражает требования ограничений целостности атрибутов и связи между сущностями.Создать рабочую базу данных и настроить права доступа к ней. Разработать команды SQL для создания реляционных таблиц базы данных. Каждый запрос должен предваряться комментарием с указанием создаваемой таблицы. Каждое
Были разработаны ограничения целостности атрибутов и ограничения ссылочной целостности данных согласно описанию приведенному ниже:Название поставщика должно быть уникальным в рамках города. Например, не могут одновременно существовать следующие поставщики: «Стройкомплект» в Челябинске по адресу ул. Электродная, 7 и «Стройкомплект» в Челябинске по адресу пр. Ленина, 3. Название, город и адрес поставщика не могут быть пустыми. По умолчанию адрес поставщика должен иметь значение «неизвестен». Рейтинг поставщика должен находиться в диапазоне от 1 до 10. Название и цена детали не могут быть пустыми. Вес и цена детали должны быть положительными. Цвет детали должен принимать значение из фиксированного списка значений (н-р: белый, черный, красный, синий, серый, зеленый, желтый, оранжевый). Название, город и адрес проекта не могут быть пустыми. Бюджет проекта должен быть положительным. Количество деталей в поставке должно быть положительным.Удаление (изменение) детали, поставщика или проекта должно инициировать каскадное удаление (изменение) соответствующих поставок.Задание 4-5. Представления1. Заполнить часть ранее созданных таблиц базы данных, используя команду SQL: insert into … values …Остальные таблицы базы данных заполнить, выполнив импорт тестовых данных из файла с расширением csv. Этот файл можно создать, например в MS Excel. В случае, если имена сущностей и/или атрибутов в файлах отличаются от использованных, внести необходимые изменения в файлы перед выполнением импорта.
Триггеры для автоматического заполнения атрибутов «Дороговизна» и «Надежность»:1) триггер для заполнения «Дороговизны» при добавлении новой записи в таблицу деталей:
2.1.1. Поставщики:
поле таблицы должно быть снабжено комментарием, в котором указана семантика поля. Убедиться, что первичные и внешние ключи и др. атрибуты реляционных таблиц базы данных адекватно отражают сущности и связи построенной модели предметной области.
Рисунок 1 – ER диаграмма, отражающая связи между таблицами и ограничения целостности атрибутов
2) Разработка ограничений целостности данных
-
CREATE DATABASE test -
WITH -
OWNER = postgres -
ENCODING = 'UTF8' -
LC_COLLATE = 'Russian_Russia.1251' -
LC_CTYPE = 'Russian_Russia.1251' -
TABLESPACE = pg_default -
CONNECTION LIMIT = -1 -
IS_TEMPLATE = FALSE; -
-
-- таблица детали -
CREATE TABLE "Detail" -
( -
ID Serial PRIMARY KEY, -- иддетали -
Name VARCHAR(128) NOT NULL, -- название, не пустое -
"Price" INTEGER CHECK("Price" > 0), -- цена, только положительная -
"Weight" INTEGER CHECK("Weight" > 0), -- вес в граммах, только положительный -
"Color" VARCHAR(128), -- цвет детали для сравнения со списком определенных цветов -
"High cost" VARCHAR(128) -
); -
-
ALTER TABLE "Detail" -
ADD CHECK ("Color" IN ('White', 'Red', 'Black', 'Grey', 'Green', 'Orange')); -
-
-- таблица поставщика -
CREATE TABLE "Contractor" -
( -
ID Serial PRIMARY KEY, -- идпоставщика -
Name VARCHAR(128) NOT NULL, -- название, не пустое -
"City" VARCHAR(128) NOT NULL, -- город, непустой -
"Address" VARCHAR(128) DEFAULT 'Неизвестен', -- адрес, не пустой, по умолчанию неизвестен -
"Rating" INTEGER CHECK("Rating" > 0 AND "Rating" <= 10), -- рейтингот 1 до 10 -
UNIQUE ("City", Name), -- уникальность названия поставщиков в одном городе -
"Reliability" VARCHAR(128) -
); -
-
-- таблица проекта -
CREATE TABLE "Project" -
( -
ID Serial PRIMARY KEY, -- идпроекта -
Name VARCHAR(128) NOT NULL, -- название, не пустое -
"City" VARCHAR(128) NOT NULL, -- город, непустой -
"Address" VARCHAR(128) NOT NULL, -- адрес, непустой -
"Budget" INTEGER CHECK("Budget" > 0) -- бюджет, только положительный -
); -
-
-- таблица доставки -
CREATE TABLE "Delivery" -
( -
ID Serial PRIMARY KEY, -- идпоставки -
"Detail_ID" INTEGER, -- ид детали -
"Contractor_ID" INTEGER, -- ид поставщика -
"Project_ID" INTEGER, -- ид проекта -
"Amount" INTEGER CHECK ("Amount" > 0), -- количество деталей, только положительное -
FOREIGN KEY ("Detail_ID") REFERENCES "Detail"(ID) -- связи -
ON DELETE CASCADE ON UPDATE CASCADE, -
FOREIGN KEY ("Contractor_ID") REFERENCES "Contractor"(ID) -
ON DELETE CASCADE ON UPDATE CASCADE, -
FOREIGN KEY ("Project_ID") REFERENCES "Project"(ID) -
ON DELETE CASCADE ON UPDATE CASCADE -
);
Были разработаны ограничения целостности атрибутов и ограничения ссылочной целостности данных согласно описанию приведенному ниже:Название поставщика должно быть уникальным в рамках города. Например, не могут одновременно существовать следующие поставщики: «Стройкомплект» в Челябинске по адресу ул. Электродная, 7 и «Стройкомплект» в Челябинске по адресу пр. Ленина, 3. Название, город и адрес поставщика не могут быть пустыми. По умолчанию адрес поставщика должен иметь значение «неизвестен». Рейтинг поставщика должен находиться в диапазоне от 1 до 10. Название и цена детали не могут быть пустыми. Вес и цена детали должны быть положительными. Цвет детали должен принимать значение из фиксированного списка значений (н-р: белый, черный, красный, синий, серый, зеленый, желтый, оранжевый). Название, город и адрес проекта не могут быть пустыми. Бюджет проекта должен быть положительным. Количество деталей в поставке должно быть положительным.Удаление (изменение) детали, поставщика или проекта должно инициировать каскадное удаление (изменение) соответствующих поставок.Задание 4-5. Представления1. Заполнить часть ранее созданных таблиц базы данных, используя команду SQL: insert into … values …Остальные таблицы базы данных заполнить, выполнив импорт тестовых данных из файла с расширением csv. Этот файл можно создать, например в MS Excel. В случае, если имена сущностей и/или атрибутов в файлах отличаются от использованных, внести необходимые изменения в файлы перед выполнением импорта.
-
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 1', 125, 15, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 2', 300, 250, 'White'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 3', 400, 1000, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 4', 25, 5, 'Grey'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 5', 50, 2, 'Grey'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 6', 500, 1000, 'Orange'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 7', 5500, 1000, 'White'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 8', 200, 4700, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 9', 1500, 400, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 10', 3000, 2500, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 11', 300, 200, 'Red'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 12', 550, 900, 'Black'); -
INSERT INTO "Detail" (Name, "Price", "Weight", "Color") -
VALUES ('Detail 13', 90, 25, 'Grey'); -
-
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 1', 'Chelyabinsk', 'Street A, 23', 9); -
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 2', 'Moscow', 'Street B, 5', 6); -
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 3', 'Zlatoust', 'Street C, 1', 7); -
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 4', 'Chelyabinsk', 'Street D, 1', 4); -
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 5', 'Vladivostok', 'Street E, 10', 2); -
INSERT INTO "Contractor" (Name, "City", "Address", "Rating") -
VALUES('Company 6', 'Ryazan', 'Street F, 9', 8); -
-
COPY "Project" FROM 'D:\SQL\Project.csv' DELIMITER ',' CSV HEADER; -
COPY "Delivery" FROM 'D:\SQL\Delivery.csv' DELIMITER ',' CSV HEADER;
Триггеры для автоматического заполнения атрибутов «Дороговизна» и «Надежность»:1) триггер для заполнения «Дороговизны» при добавлении новой записи в таблицу деталей:
-
CREATE OR REPLACE FUNCTION TriggerCheckPrice() RETURNS TRIGGER AS $$ -
BEGIN -
IF TG_OP = 'INSERT' THEN -
UPDATE "Detail" -
SET "High cost" = -
CASE -
WHEN "Price" >= 1000 -
THEN 'Дорогая' -
ELSE 'Дешёвая' -
END; -
RETURN NEW; -
END IF; -
END; -
$$ LANGUAGE plpgsql; -
-
CREATE TRIGGER CheckPrice -
AFTER INSERT ON "Detail" FOR EACH ROW EXECUTE -
PROCEDURE TriggerCheckPrice();
-
CREATE OR REPLACE FUNCTION TriggerCheckRating() RETURNS TRIGGER AS $$ -
BEGIN -
IF TG_OP = 'INSERT' THEN -
UPDATE "Contractor" -
SET "Reliability" = -
CASE -
WHEN "Rating" >= 6 -
THEN 'Надёжный' -
ELSE 'Ненадёжный' -
END; -
RETURN NEW; -
END IF; -
END; -
$$ LANGUAGE plpgsql; -
-
CREATE TRIGGER CheckRating -
AFTER INSERT ON "Contractor" FOR EACH ROW EXECUTE -
PROCEDURE TriggerCheckRating();
2.1.1. Поставщики:
-
CREATE VIEW "EconomistContractor" AS -
SELECT name, "City", "Address", "Rating", "Reliability" FROM "Contractor" -
ORDER BY "City", Name, "Rating" DESC; -
-
SELECT * FROM "EconomistContractor";
-
CREATE VIEW "EconomistDetail" AS -
SELECT -
Name, ROUND("Price"/1000.0, 3) AS "Price, K RUB", "Color", ROUND("Weight"/1000.0, 3) AS "Weight, Kg", "High cost" -
FROM "Detail" -
ORDER BY "Price, K RUB" DESC, Name, "Color", "Weight, Kg"; -
-
SELECT * FROM "EconomistDetail"; -
-
CREATE VIEW "EconomistProject" AS -
SELECT Name, "City", "Address", "Budget" FROM "Project" -
ORDER BY "City", Name, "Budget" DESC; -
-
SELECT * FROM "EconomistProject"; -
-
CREATE VIEW "EconomistDelivery" AS -
SELECT -
"Detail".Name AS "NameDetail", -
"Detail"."Color" AS "ColorDetail", -
"Detail"."High cost" AS "HighcostDetail", -
"Contractor".Name AS "NameContractor", -
"Contractor"."City" AS "CityContractor", -
"Contractor"."Reliability" AS "ReliabilityContractor", -
"Delivery"."Amount" AS "AmountDelivery", -
ROUND("Delivery"."Amount" * "Weight"/1000.0,3) AS "WeightDelivery", -
ROUND("Delivery"."Amount" * "Price"/1000.0, 3) AS "PriceDelivery" -
FROM "Detail", "Contractor", "Delivery", "Project" -
WHERE "Detail_ID" = "Detail".id AND "Contractor_ID" = "Contractor".id -
AND "Project_ID" = "Project".id -
ORDER BY "NameDetail", "NameContractor", "PriceDelivery" DESC, "WeightDelivery" DESC; -
-
SELECT * FROM "EconomistDelivery";