-- DevOpsPath SQL Course: E-Commerce Sample Database Schema -- Run this first: sqlite3 ecommerce.db < schema.sql -- Categories table (hierarchical — supports recursive CTE lessons) CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, parent_id INTEGER, description TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (parent_id) REFERENCES categories(id) ); -- Customers table CREATE TABLE customers ( id INTEGER PRIMARY KEY AUTOINCREMENT, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, city TEXT, state TEXT, country TEXT NOT NULL DEFAULT 'US', signup_date TEXT NOT NULL, is_active INTEGER NOT NULL DEFAULT 1 ); -- Products table CREATE TABLE products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, description TEXT, price REAL NOT NULL CHECK(price >= 0), category_id INTEGER NOT NULL, stock_quantity INTEGER NOT NULL DEFAULT 0 CHECK(stock_quantity >= 0), is_available INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (category_id) REFERENCES categories(id) ); -- Orders table CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_id INTEGER NOT NULL, order_date TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')), total_amount REAL NOT NULL DEFAULT 0 CHECK(total_amount >= 0), shipping_address TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (customer_id) REFERENCES customers(id) ); -- Order items (junction table — many-to-many between orders and products) CREATE TABLE order_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, product_id INTEGER NOT NULL, quantity INTEGER NOT NULL CHECK(quantity > 0), unit_price REAL NOT NULL CHECK(unit_price >= 0), FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) ); -- Reviews table CREATE TABLE reviews ( id INTEGER PRIMARY KEY AUTOINCREMENT, product_id INTEGER NOT NULL, customer_id INTEGER NOT NULL, rating INTEGER NOT NULL CHECK(rating BETWEEN 1 AND 5), title TEXT, comment TEXT, review_date TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (product_id) REFERENCES products(id), FOREIGN KEY (customer_id) REFERENCES customers(id) ); -- Indexes for common query patterns CREATE INDEX idx_products_category ON products(category_id); CREATE INDEX idx_orders_customer ON orders(customer_id); CREATE INDEX idx_orders_date ON orders(order_date); CREATE INDEX idx_orders_status ON orders(status); CREATE INDEX idx_order_items_order ON order_items(order_id); CREATE INDEX idx_order_items_product ON order_items(product_id); CREATE INDEX idx_reviews_product ON reviews(product_id); CREATE INDEX idx_reviews_customer ON reviews(customer_id); CREATE INDEX idx_customers_email ON customers(email);