|
@@ -0,0 +1,165 @@
|
|
|
|
|
+-- Создание таблицы поставщиков
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS suppliers (
|
|
|
|
|
+ supplier_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ organization_name VARCHAR(150) NOT NULL,
|
|
|
|
|
+ address VARCHAR(255),
|
|
|
|
|
+ contacts VARCHAR(100),
|
|
|
|
|
+ rating INTEGER CHECK (rating BETWEEN 1 AND 10),
|
|
|
|
|
+ products VARCHAR(150)
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы кормов
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS feed (
|
|
|
|
|
+ feed_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ feed_type VARCHAR(100) NOT NULL,
|
|
|
|
|
+ quantity NUMERIC(10,2) CHECK (quantity >= 0)
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы поставок кормов
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS feed_supply (
|
|
|
|
|
+ supply_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ supplier_id INTEGER NOT NULL,
|
|
|
|
|
+ feed_id INTEGER NOT NULL,
|
|
|
|
|
+ supply_date DATE NOT NULL,
|
|
|
|
|
+ CONSTRAINT fk_feed_supply_supplier
|
|
|
|
|
+ FOREIGN KEY (supplier_id)
|
|
|
|
|
+ REFERENCES suppliers(supplier_id)
|
|
|
|
|
+ ON DELETE CASCADE,
|
|
|
|
|
+ CONSTRAINT fk_feed_supply_feed
|
|
|
|
|
+ FOREIGN KEY (feed_id)
|
|
|
|
|
+ REFERENCES feed(feed_id)
|
|
|
|
|
+ ON DELETE CASCADE
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы закупок
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS purchase_list (
|
|
|
|
|
+ purchase_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ number VARCHAR(50) NOT NULL,
|
|
|
|
|
+ purchase_date DATE NOT NULL,
|
|
|
|
|
+ product_name VARCHAR(150) NOT NULL,
|
|
|
|
|
+ quantity NUMERIC(10,2) CHECK (quantity > 0),
|
|
|
|
|
+ supplier_id INTEGER NOT NULL,
|
|
|
|
|
+ CONSTRAINT fk_purchase_supplier
|
|
|
|
|
+ FOREIGN KEY (supplier_id)
|
|
|
|
|
+ REFERENCES suppliers(supplier_id)
|
|
|
|
|
+ ON DELETE CASCADE
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы должностей
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS positions (
|
|
|
|
|
+ position_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ position_name VARCHAR(100) NOT NULL,
|
|
|
|
|
+ salary NUMERIC(10,2) CHECK (salary > 0)
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы сотрудников
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS employees (
|
|
|
|
|
+ employee_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ full_name VARCHAR(150) NOT NULL,
|
|
|
|
|
+ birth_date DATE,
|
|
|
|
|
+ gender VARCHAR(10),
|
|
|
|
|
+ passport_data VARCHAR(50),
|
|
|
|
|
+ inn VARCHAR(12) UNIQUE,
|
|
|
|
|
+ phone VARCHAR(20),
|
|
|
|
|
+ address VARCHAR(255),
|
|
|
|
|
+ position_id INTEGER NOT NULL,
|
|
|
|
|
+ CONSTRAINT fk_employee_position
|
|
|
|
|
+ FOREIGN KEY (position_id)
|
|
|
|
|
+ REFERENCES positions(position_id)
|
|
|
|
|
+ ON DELETE RESTRICT
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы вольеров
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS enclosures (
|
|
|
|
|
+ enclosure_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ enclosure_number VARCHAR(50) NOT NULL,
|
|
|
|
|
+ enclosure_type VARCHAR(100) NOT NULL
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы животных
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS animals (
|
|
|
|
|
+ animal_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ name VARCHAR(100) NOT NULL,
|
|
|
|
|
+ species VARCHAR(100) NOT NULL,
|
|
|
|
|
+ birth_date DATE,
|
|
|
|
|
+ enclosure_id INTEGER NOT NULL,
|
|
|
|
|
+ CONSTRAINT fk_animal_enclosure
|
|
|
|
|
+ FOREIGN KEY (enclosure_id)
|
|
|
|
|
+ REFERENCES enclosures(enclosure_id)
|
|
|
|
|
+ ON DELETE RESTRICT
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы клиентов
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS clients (
|
|
|
|
|
+ client_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ full_name VARCHAR(150) NOT NULL,
|
|
|
|
|
+ address VARCHAR(255),
|
|
|
|
|
+ phone VARCHAR(20)
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы услуг
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS services (
|
|
|
|
|
+ service_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ service_type VARCHAR(150) NOT NULL,
|
|
|
|
|
+ price NUMERIC(10,2) CHECK (price > 0)
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы заказов услуг
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS service_orders (
|
|
|
|
|
+ order_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ client_id INTEGER NOT NULL,
|
|
|
|
|
+ service_id INTEGER NOT NULL,
|
|
|
|
|
+ employee_id INTEGER NOT NULL,
|
|
|
|
|
+ order_date DATE NOT NULL,
|
|
|
|
|
+ quantity INTEGER CHECK (quantity > 0),
|
|
|
|
|
+ total_cost NUMERIC(12,2),
|
|
|
|
|
+ CONSTRAINT fk_order_client
|
|
|
|
|
+ FOREIGN KEY (client_id)
|
|
|
|
|
+ REFERENCES clients(client_id)
|
|
|
|
|
+ ON DELETE CASCADE,
|
|
|
|
|
+ CONSTRAINT fk_order_service
|
|
|
|
|
+ FOREIGN KEY (service_id)
|
|
|
|
|
+ REFERENCES services(service_id)
|
|
|
|
|
+ ON DELETE RESTRICT,
|
|
|
|
|
+ CONSTRAINT fk_order_employee
|
|
|
|
|
+ FOREIGN KEY (employee_id)
|
|
|
|
|
+ REFERENCES employees(employee_id)
|
|
|
|
|
+ ON DELETE RESTRICT
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание таблицы наблюдений
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS observations (
|
|
|
|
|
+ observation_id SERIAL PRIMARY KEY,
|
|
|
|
|
+ employee_id INTEGER NOT NULL,
|
|
|
|
|
+ animal_id INTEGER NOT NULL,
|
|
|
|
|
+ observation_date DATE NOT NULL,
|
|
|
|
|
+ comment TEXT,
|
|
|
|
|
+ CONSTRAINT fk_observation_employee
|
|
|
|
|
+ FOREIGN KEY (employee_id)
|
|
|
|
|
+ REFERENCES employees(employee_id)
|
|
|
|
|
+ ON DELETE CASCADE,
|
|
|
|
|
+ CONSTRAINT fk_observation_animal
|
|
|
|
|
+ FOREIGN KEY (animal_id)
|
|
|
|
|
+ REFERENCES animals(animal_id)
|
|
|
|
|
+ ON DELETE CASCADE
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+-- Создание функции для автоматического расчета итоговой стоимости услуги
|
|
|
|
|
+CREATE OR REPLACE FUNCTION calculate_total_cost()
|
|
|
|
|
+RETURNS TRIGGER AS
|
|
|
|
|
+$$
|
|
|
|
|
+BEGIN
|
|
|
|
|
+ SELECT NEW.quantity * price
|
|
|
|
|
+ INTO NEW.total_cost
|
|
|
|
|
+ FROM services
|
|
|
|
|
+ WHERE service_id = NEW.service_id;
|
|
|
|
|
+
|
|
|
|
|
+ RETURN NEW;
|
|
|
|
|
+END;
|
|
|
|
|
+$$ LANGUAGE plpgsql;
|
|
|
|
|
+
|
|
|
|
|
+-- Создание триггера для автоматического вызова функции расчета стоимости
|
|
|
|
|
+CREATE TRIGGER trg_calculate_total_cost
|
|
|
|
|
+BEFORE INSERT OR UPDATE ON service_orders
|
|
|
|
|
+FOR EACH ROW
|
|
|
|
|
+EXECUTE FUNCTION calculate_total_cost();
|