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) ); -------------------------------------------- -- Raw materials, ingredients and recipes -------------------------------------------- -- 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. -- Not currently used, but kept as an example. 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? -- Glues together the cookies and ingredients, a 'recipe'. 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. -- This should reference the ingredients table, but we'll keep it simple for now. 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, FOREIGN KEY (cookie_id) REFERENCES cookies(cookie_id) FOREIGN KEY (order_id) REFERENCES orders(order_id) ); -- Connects pallets to orders CREATE TABLE IF NOT EXISTS deliveries ( delivery_date DATE DEFAULT NOW, order_id INT NOT NULL, pallet_id INT NOT NULL, FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (pallet_id) REFERENCES pallets(pallet_id), PRIMARY KEY (order_id, pallet_id) ); -------------------------------------------- -- Views -------------------------------------------- -- Pallet CREATE VIEW IF NOT EXISTS pallets_view AS SELECT pallets.pallet_id, cookie_name, pallets.order_id, status, production_date, delivery_date FROM pallets LEFT JOIN cookies ON pallets.cookie_id = cookies.cookie_id LEFT JOIN deliveries ON pallets.pallet_id = deliveries.pallet_id; PRAGMA foreign_keys = ON;