wiki:RelationalDesign

Version 2 (modified by 211561, 2 weeks ago) ( diff )

--

DDL скрипта

DROP TABLE IF EXISTS ORDER_BATCHES;
DROP TABLE IF EXISTS PAYMENTS;
DROP TABLE IF EXISTS ORDERS;
DROP TABLE IF EXISTS BATCHES;
DROP TABLE IF EXISTS PRODUCTS;
DROP TABLE IF EXISTS PRODUCERS;
DROP TABLE IF EXISTS CLIENTS;
DROP TABLE IF EXISTS USERS;
DROP TYPE IF EXISTS currency_enum;
DROP TYPE IF EXISTS payment_status_enum;
DROP TYPE IF EXISTS boolean_enum;

CREATE TABLE USERS (
  id UUID PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  password TEXT NOT NULL,
  is_admin BOOLEAN NOT NULL DEFAULT FALSE
);

CREATE TABLE CLIENTS (
  id UUID PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  country VARCHAR(100),
  registration_number VARCHAR(100),
  tax_code VARCHAR(100),
  contact_person VARCHAR(200),
  phone_number VARCHAR(50),
  billing_address TEXT,
  shipping_address TEXT
);

CREATE TABLE PRODUCERS (
  id UUID PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  address TEXT,
  country VARCHAR(100),
  phone_number VARCHAR(50),
  email VARCHAR(255)
);

CREATE TABLE PRODUCTS (
  id UUID PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  description TEXT,
  hs_code VARCHAR(50),
  price NUMERIC(14,4) NOT NULL DEFAULT 0,
  producer_id UUID REFERENCES PRODUCERS(id) ON DELETE SET NULL,
  unit_of_measure VARCHAR(50)
);

CREATE TABLE BATCHES (
  id UUID PRIMARY KEY,
  product_id UUID REFERENCES PRODUCTS(id) ON DELETE CASCADE,
  batch_code VARCHAR(100) NOT NULL,
  production_date DATE,
  expiration_date DATE,
  net_weight NUMERIC(12,4),
  gross_weight NUMERIC(12,4),
  units_per_batch INTEGER
);

CREATE TABLE TRANSPORTS (
  id UUID PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  departure_point VARCHAR(255),
  arrival_point VARCHAR(255),
  estimated_departure_date DATE,
  estimated_arrival_date DATE,
  incoterm VARCHAR(50),
  insurance_conditions TEXT
);

CREATE TABLE ORDERS (
  id UUID PRIMARY KEY,
  date DATE NOT NULL,
  status VARCHAR(50),
  estimated_delivery_date DATE,
  buyer_id UUID REFERENCES CLIENTS(id) ON DELETE SET NULL,
  receiver_id UUID REFERENCES CLIENTS(id) ON DELETE SET NULL,
  transport_id UUID REFERENCES TRANSPORTS(id) ON DELETE SET NULL
);

CREATE TABLE PAYMENTS (
  id UUID PRIMARY KEY,
  order_id UUID UNIQUE REFERENCES ORDERS(id) ON DELETE CASCADE,
  amount NUMERIC(18,4) NOT NULL,
  currency VARCHAR(10) DEFAULT 'USD',
  due_date DATE,
  exchange_rate NUMERIC(18,8) DEFAULT 1.0,
  payment_date DATE,
  payment_method VARCHAR(100),
  payment_status VARCHAR(50)
);

CREATE TABLE ORDER_BATCHES (
  id UUID PRIMARY KEY,
  order_id UUID REFERENCES ORDERS(id) ON DELETE CASCADE,
  batch_id UUID REFERENCES BATCHES(id) ON DELETE RESTRICT,
  quantity INTEGER NOT NULL,
  price_per_unit NUMERIC(14,4) NOT NULL,
  total_price NUMERIC(18,4) NOT NULL,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

DML скрипта

INSERT INTO USERS (id, name, email, password, is_admin) VALUES
('11111111-1111-1111-1111-111111111111', 'Alice Admin', 'alice@example.com', 'hashed_password_1', TRUE),
('22222222-2222-2222-2222-222222222222', 'Bob Buyer', 'bob@example.com', 'hashed_password_2', FALSE);

INSERT INTO CLIENTS (id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address) VALUES
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Acme Imports', 'Italy', 'REG-IT-0001', 'TAXIT0001', 'Giulia Rossi', '+39 06 1234567', 'Via Roma 1, 00100 Roma, Italy', 'Port of Naples, Dock 5'),
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'Global Retailer', 'Germany', 'DE-REG-2020', 'DE-TAX-2020', 'Hans Müller', '+49 30 7654321', 'Hauptstrasse 10, 10115 Berlin, Germany', 'Warehouse 3, Berlin');

INSERT INTO PRODUCERS (id, name, address, country, phone_number, email) VALUES
('33333333-3333-3333-3333-333333333333', 'Producer Co.', 'Industrial Park 5, Zona A', 'Spain', '+34 91 1234567', 'sales@producerco.example'),
('44444444-4444-4444-4444-444444444444', 'Farm Fresh Ltd.', 'Countryside Road 12', 'France', '+33 1 23456789', 'contact@farmfresh.example');

INSERT INTO PRODUCTS (id, name, description, hs_code, price, producer_id, unit_of_measure) VALUES
('55555555-5555-5555-5555-555555555555', 'Organic Olive Oil', 'Extra virgin olive oil, cold pressed', '150900', 12.5000, '33333333-3333-3333-3333-333333333333', 'L'),
('66666666-6666-6666-6666-666666666666', 'Canned Tomatoes', 'San Marzano peeled tomatoes', '200210', 1.2000, '44444444-4444-4444-4444-444444444444', 'kg');

INSERT INTO BATCHES (id, product_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch) VALUES
('77777777-7777-7777-7777-777777777777', '55555555-5555-5555-5555-555555555555', 'OO-202509-A', '2025-06-01', '2027-06-01', 1000.0000, 1020.0000, 1000),
('88888888-8888-8888-8888-888888888888', '66666666-6666-6666-6666-666666666666', 'CT-202509-01', '2025-07-15', '2028-07-15', 500.0000, 510.0000, 500);

INSERT INTO TRANSPORTS (id, name, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions) VALUES
('99999999-9999-9999-9999-999999999999', 'Mediterranean Sea Freight', 'Port of Valencia', 'Port of Naples', '2025-09-20', '2025-09-25', 'FOB', 'Standard cargo insurance'),
('aaaaaaaa-0000-aaaa-0000-aaaaaaaa0000', 'Road Carrier EU', 'Berlin Warehouse', 'Acme Imports HQ', '2025-10-01', '2025-10-03', 'DAP', 'Carrier liability');

INSERT INTO ORDERS (id, date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id) VALUES
('dddddddd-dddd-dddd-dddd-dddddddddddd', '2025-09-01', 'Pending', '2025-10-05', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '99999999-9999-9999-9999-999999999999'),
('eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', '2025-09-10', 'Confirmed', '2025-10-10', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'aaaaaaaa-0000-aaaa-0000-aaaaaaaa0000');

INSERT INTO PAYMENTS (id, order_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status) VALUES
('ffffffff-ffff-ffff-ffff-ffffffffffff', 'dddddddd-dddd-dddd-dddd-dddddddddddd', 12500.0000, 'EUR', '2025-10-01', 1.00000000, NULL, 'Wire Transfer', 'Pending'),
('11111111-aaaa-1111-aaaa-11111111aaaa', 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', 600.0000, 'EUR', '2025-10-05', 1.00000000, '2025-09-15', 'Credit Card', 'Completed');

INSERT INTO ORDER_BATCHES (id, order_id, batch_id, quantity, price_per_unit, total_price, created_at, updated_at) VALUES
('22222222-2222-2222-2222-222222222222', 'dddddddd-dddd-dddd-dddd-dddddddddddd', '77777777-7777-7777-7777-777777777777', 200, 12.5000, 2500.0000, now(), now()),
('33333333-3333-3333-3333-333333333333', 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', '88888888-8888-8888-8888-888888888888', 500, 1.2000, 600.0000, now(), now());

Attachments (2)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.