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

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

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

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

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

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

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

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

-- Допущения

-- 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 газа в единицу времени.

CREATE TABLE Consumer(

        id INT PRIMARY KEY,

        name VARCHAR(20) NOT NULL,

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

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

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

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

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

-- buy_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),

        buy_price FLOAT NOT NULL CHECK(buy_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 --

-- Один из ваших производителей решил поднять цены. Вы конечно же хотите

-- распределить повышение цены по покупателям но вас тревожит мысль о том, что  

-- покупатели могут взбунтоваться. Они вообще терпеливые, но если они

-- вместо X начинают платить за газ в два раза больше, они  поднимают бунт. И если их

-- дефицит достигает 50%, они тоже бузят.

-- У вас есть выбор: отказаться от услуг жадины-производителя (увеличив таким

-- образом дефицит) или поднять цены покупателям.

-- Напишите процедуру, которая решит, в каком случае количество бунтовщиков будет

-- меньше. Предполагайте что если покупатель C забирает в хабе H 10% всего

-- выходящего из H газа, то он покупает 10% объёма каждой входящей в этот хаб трубы.

-- Пара дополнительных представлений может сильно облегчить вам жизнь.