CREATE TABLE users ( user_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, phone_number VARCHAR(20), created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, status ENUM('active', 'inactive', 'suspended') DEFAULT 'active' ); CREATE TABLE customers ( customer_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, full_name VARCHAR(100), birth_date DATE, registration_date DATE, customer_type ENUM('individual', 'business', 'vip') DEFAULT 'individual', FOREIGN KEY (user_id) REFERENCES users(id) ); CREATE TABLE user_addresses ( address_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, customer_id INT, address_line1 VARCHAR(200), address_line2 VARCHAR(200), city_id INT, postal_code VARCHAR(20), is_default BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); CREATE TABLE products ( product_id INT PRIMARY KEY AUTO_INCREMENT, product_code VARCHAR(50) UNIQUE NOT NULL, product_name VARCHAR(200) NOT NULL, description TEXT, price DECIMAL(10,2) NOT NULL, cost_price DECIMAL(10,2), category_id INT, supplier_id INT, stock_quantity INT DEFAULT 0, reorder_level INT DEFAULT 10, created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, modified_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE items ( item_id INT PRIMARY KEY AUTO_INCREMENT, product_id INT NOT NULL, sku VARCHAR(50) UNIQUE, variant_name VARCHAR(100), additional_price DECIMAL(10,2) DEFAULT 0, inventory_count INT DEFAULT 0, FOREIGN KEY (product_id) REFERENCES products(product_id) ); CREATE TABLE categories ( category_id INT PRIMARY KEY AUTO_INCREMENT, category_name VARCHAR(100) NOT NULL, parent_category_id INT, category_path VARCHAR(500), FOREIGN KEY (parent_category_id) REFERENCES categories(category_id) ); CREATE TABLE orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, order_number VARCHAR(50) UNIQUE NOT NULL, customer_id INT NOT NULL, user_id INT, order_date DATETIME DEFAULT CURRENT_TIMESTAMP, order_status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending', total_amount DECIMAL(10,2), net_amount DECIMAL(10,2), shipping_address_id INT, billing_address_id INT, payment_method VARCHAR(50) ); CREATE TABLE order_items ( order_item_id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, item_id INT, product_id INT, quantity INT NOT NULL, unit_price DECIMAL(10,2) NOT NULL, discount DECIMAL(10,2) DEFAULT 0, subtotal DECIMAL(10,2), FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (item_id) REFERENCES items(item_id), FOREIGN KEY (product_id) REFERENCES products(product_id) ); CREATE TABLE shipments ( shipment_id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, shipment_date DATE, estimated_delivery DATE, actual_delivery DATE, carrier VARCHAR(100), tracking_number VARCHAR(100), status ENUM('preparing', 'shipped', 'in_transit', 'delivered') DEFAULT 'preparing' ); CREATE TABLE product_suppliers ( product_id INT NOT NULL, supplier_id INT NOT NULL, is_primary BOOLEAN DEFAULT FALSE, purchase_price DECIMAL(10,2), PRIMARY KEY (product_id, supplier_id), FOREIGN KEY (product_id) REFERENCES products(product_id) ); CREATE TABLE user_wishlists ( user_id INT NOT NULL, product_id INT NOT NULL, added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, priority INT DEFAULT 1, PRIMARY KEY (user_id, product_id), FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (product_id) REFERENCES products(product_id) ); CREATE TABLE payments ( payment_id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, payment_date DATETIME DEFAULT CURRENT_TIMESTAMP, amount DECIMAL(10,2), payment_type VARCHAR(50), transaction_id VARCHAR(100), payment_status ENUM('pending', 'completed', 'failed', 'refunded') ); CREATE TABLE reviews ( review_id INT PRIMARY KEY AUTO_INCREMENT, product_id INT NOT NULL, user_id INT NOT NULL, rating INT CHECK (rating >= 1 AND rating <= 5), comment TEXT, review_date DATE, helpful_count INT DEFAULT 0 ); CREATE TABLE promotions ( promo_id INT PRIMARY KEY AUTO_INCREMENT, promo_code VARCHAR(50) UNIQUE, promo_name VARCHAR(100), discount_type ENUM('percentage', 'fixed', 'buy_one_get_one'), discount_value DECIMAL(10,2), start_date DATE, end_date DATE, minimum_purchase DECIMAL(10,2) );