PRAGMA foreign_keys = OFF; -- Drop everything... DROP TABLE IF EXISTS pallets; DROP TABLE IF EXISTS raw_materials_deliveries; DROP TABLE IF EXISTS raw_materials; DROP TABLE IF EXISTS orders; DROP TABLE IF EXISTS customers; DROP TABLE IF EXISTS cookies; -------------------------------------------- -- Recipe/Cookie related tables -------------------------------------------- -- Holds the different types of cookies we can make. CREATE TABLE IF NOT EXISTS cookies ( cookie_id INTEGER PRIMARY KEY, cookie_name VARCHAR(50) NOT NULL UNIQUE ); -- Our known customers, may need more fields CREATE TABLE IF NOT EXISTS customers ( customer_id INTEGER PRIMARY KEY, customer_name VARCHAR(50) NOT NULL, customer_address VARCHAR(50) NOT NULL ); -- Orders from customers. CREATE TABLE IF NOT EXISTS orders ( order_id INTEGER PRIMARY KEY, customer_id INT NOT NULL, cookie_id INT NOT NULL, order_date DATE NOT NULL DEFAULT CURRENT_DATE CHECK (order_date >= CURRENT_DATE), FOREIGN KEY (customer_id) REFERENCES customers(customer_id), FOREIGN KEY (cookie_id) REFERENCES cookies(cookie_id) ); -------------------------------------------- -- Recipe/Cookie related tables -------------------------------------------- -- Notes: the unit type can be defined in terms -- of volume or weight instead. Here we choose -- to use static si-prefixes in relevant tables. -- What types of ingredients do we handle CREATE TABLE IF NOT EXISTS ingredients ( ingredient_id INTEGER PRIMARY KEY, ingredient_name VARCHAR(50) NOT NULL UNIQUE, preferred_unit VARCHAR(50) NOT NULL CHECK (preferred_unit IN ('g', 'ml')) ); -- What ingredients are in what cookies CREATE TABLE IF NOT EXISTS recipe_contents ( cookie_id INT NOT NULL, ingredient_id INT NOT NULL, quantity INT NOT NULL, unit VARCHAR(50) NOT NULL CHECK (unit IN ('g', 'ml')), PRIMARY KEY (cookie_id, ingredient_id), FOREIGN KEY (cookie_id) REFERENCES cookies(cookie_id), FOREIGN KEY (ingredient_id) REFERENCES ingredients(ingredient_id) ); -- Describes ingredients and stock. CREATE TABLE IF NOT EXISTS raw_materials ( ingredient_id INTEGER PRIMARY KEY, ingredient_name VARCHAR(50) NOT NULL UNIQUE, ingredient_quantity INT NOT NULL, unit VARCHAR(50) NOT NULL CHECK (unit IN ('g', 'ml')) ); -- When did we get the ingredients? CREATE TABLE IF NOT EXISTS raw_materials_deliveries ( delivery_id INTEGER PRIMARY KEY, ingredient_id INT NOT NULL, delivery_date DATE NOT NULL, delivery_quantity INT NOT NULL, unit VARCHAR(50) NOT NULL CHECK (unit IN ('g', 'ml')), FOREIGN KEY (ingredient_id) REFERENCES raw_materials(ingredient_id) ); -------------------------------------------- -- Pallet related tables -------------------------------------------- -- Pallets are used to store cookies for delivery -- Order related columns are unused for now. CREATE TABLE IF NOT EXISTS pallets ( pallet_id INTEGER PRIMARY KEY, cookie_id INT NOT NULL, order_id INT, -- This should be not null status VARCHAR(50) NOT NULL CHECK (status IN ('freezer', 'delivered', 'blocked')), production_date DATE NOT NULL, delivery_date DATE DEFAULT NULL, FOREIGN KEY (cookie_id) REFERENCES cookies(cookie_id) FOREIGN KEY (order_id) REFERENCES orders(order_id) ); -------------------------------------------- -- Views -------------------------------------------- -- Pallet CREATE VIEW IF NOT EXISTS pallets_view AS SELECT pallet_id, cookie_name, order_id, status, production_date, delivery_date FROM pallets JOIN cookies ON pallets.cookie_id = cookies.cookie_id; PRAGMA foreign_keys = ON;