Контрольная работа №2. Вариант 2010-51

-- Моделируем перепродажу газа

-- Есть производители газа, транзитные хабы

-- и покупатели, забирающие газ из хабов

-- Производители и покупатели соединены трубами с хабами

-- К одному хабу могут идти трубы от разных производителей и к разным покупателям,

-- Вы занимаетесь привычным делом: покупаете газ у производителей и продаёте его покупателям, но дороже.

-- Если надо, строите трубопроводы

-- Допущения

-- 1.Все трубы всегда заполнены газом

-- 2. Производитель может отдавать в трубы меньше чем мог бы произвести (и тогда у него есть резерв)

-- покупатель может получать меньше чем ему нужно (и у него тогда есть дефицит)

-- 3. Если из хаба выходит меньше чем входит, то остатки тупо сжигаются

-- Все объёмы указаны в расчёте на некую условную единицу времени, все цены в расчёте на единицу объёма

DROP TABLE ConsumerPipe

DROP TABLE ConsumerPipePrice

DROP TABLE Consumer

DROP TABLE ProducerPipe

DROP TABLE Hub

DROP TABLE Producer

GO        

-- Производитель. Он может производить volume газа в единицу времени и продаёт по sell_price за единицу объёма

-- Провести к нему трубу стоит pipe_price за единицу пропускной способности трубы

CREATE TABLE Producer (

        id INT PRIMARY KEY,

        name VARCHAR(20) NOT NULL,

        volume FLOAT NOT NULL CHECK (volume>0),

        sell_price FLOAT NOT NULL CHECK(sell_price>0),

        pipe_price FLOAT NOT NULL CHECK(pipe_price>0))

        

-- Транзитный хаб

CREATE TABLE Hub(

        id INT PRIMARY KEY,

        name VARCHAR(20) NOT NULL)

        

-- Труба между производителем и хабом

-- Она может пропустить tpt газа в единицу времени

CREATE TABLE ProducerPipe(

        id INT PRIMARY KEY,

        tpt FLOAT NOT NULL CHECK(tpt>0),

        hub_id INT FOREIGN KEY REFERENCES Hub(id),

        producer_id INT FOREIGN KEY REFERENCES Producer(id),

        UNIQUE (hub_id, producer_id))

        

-- Покупатель. Ему нужно volume газа в единицу времени, он платит buy_price за единицу объёма,

-- провести к нему трубу стоит pipe_price за единицу пропускной способности

CREATE TABLE Consumer(

        id INT PRIMARY KEY,

        name VARCHAR(20) NOT NULL,

        volume FLOAT NOT NULL CHECK(volume>=0),

        buy_price FLOAT NOT NULL CHECK(buy_price>0))

-- Стоимость прокладки трубы единичной пропускной способности между данными

-- хабом и покупателем.

-- build_price -- стоимость постройки новой трубы

-- increase_price -- стоимость расширения уже существующей

CREATE TABLE ConsumerPipePrice(

    id INT PRIMARY KEY,

        consumer_id INT FOREIGN KEY REFERENCES Consumer(id),

        hub_id INT FOREIGN KEY REFERENCES Hub(id),

        build_price  FLOAT NOT NULL CHECK(build_price>0),

        increase_price FLOAT NOT NULL CHECK(increase_price>0),

        UNIQUE (consumer_id, hub_id))

-- Труба между покупателем и хабом

-- Она может пропустить tpt газа в единицу времени

CREATE TABLE ConsumerPipe(

        id INT PRIMARY KEY,

        tpt FLOAT NOT NULL CHECK(tpt>0),

        consumer_pipe_price_id INT FOREIGN KEY REFERENCES ConsumerPipePrice(id))

        

        

go

-- 1 --

-- Один из ваших покупателей решил отказаться от ваших услуг. Вы хотите перевести весь потребляемый им газ

-- другому покупателю, у которого страшный дефицит. Для этого вам нужно от тех хабов, откуда брал газ

-- ваш утерянный клиент, проложить новые трубы к бедствующему или расширить имеющиеся,если они есть.

-- Посчитайте, окупится ли это действие за данный период времени и если не окупится, то во сколько раз надо

-- поднять цену закупки для бедолаги-покупателя чтоб хотя бы остаться в нуле.

--

-- Процедура: Reroute(@consumer_gone_id, @consumer_poor_id, @time_period INT)