DATABASE SCHEMA ANALYSIS REPORT
==================================================

SCHEMA OVERVIEW
---------------
Total Tables: 8
Total Columns: 52
Tables with Primary Keys: 8
Total Foreign Keys: 6
Total Indexes: 15

KEY RECOMMENDATIONS
------------------
1. Address 3 high-severity issues immediately
2. Add primary keys to tables: 
3. Review 4 VARCHAR(255) columns for right-sizing
4. Consider adding 2 foreign key constraints for referential integrity
5. Review 8 normalization issues for schema optimization

NORMALIZATION ISSUES (8 total)
------------------------------
High: 2, Medium: 3, Low: 2, Warning: 1

• products: Column 'dimensions' appears to store delimited values
  Suggestion: Create separate table for individual values with foreign key relationship

• products: Column 'tags' appears to store delimited values
  Suggestion: Create separate table for individual values with foreign key relationship

• products: Columns ['category_name'] may have transitive dependency through 'category_id'
  Suggestion: Consider creating separate 'category' table with these columns

• orders: Columns ['shipping_street', 'shipping_city', 'shipping_state', 'shipping_postal_code', 'shipping_country'] may have transitive dependency through 'shipping_address_id'
  Suggestion: Consider creating separate 'shipping_address' table with these columns

• user_preferences: Column 'preferred_categories' appears to store delimited values
  Suggestion: Create separate table for individual values with foreign key relationship

DATA TYPE ISSUES (4 total)
--------------------------
• products.dimensions: VARCHAR(255) antipattern
  Current: VARCHAR(50) → Suggested: Appropriately sized VARCHAR or TEXT
  Rationale: VARCHAR(255) is often used as default without considering actual data length requirements

• products.tags: VARCHAR(255) antipattern
  Current: VARCHAR(500) → Suggested: Appropriately sized VARCHAR or TEXT
  Rationale: VARCHAR(255) is often used as default without considering actual data length requirements

• user_preferences.preferred_categories: VARCHAR(255) antipattern
  Current: VARCHAR(500) → Suggested: Appropriately sized VARCHAR or TEXT
  Rationale: VARCHAR(255) is often used as default without considering actual data length requirements

• user_preferences.email_notifications: VARCHAR(255) antipattern
  Current: VARCHAR(255) → Suggested: Appropriately sized VARCHAR or TEXT
  Rationale: VARCHAR(255) is often used as default without considering actual data length requirements

CONSTRAINT ISSUES (12 total)
-----------------------------
High: 0, Medium: 4, Low: 8

• products: Column 'price' should validate positive values
  Suggestion: Add CHECK constraint: price > 0

• products: Column 'inventory_count' should validate positive values
  Suggestion: Add CHECK constraint: inventory_count > 0

• orders: Column 'total_amount' should validate positive values
  Suggestion: Add CHECK constraint: total_amount > 0

• order_items: Column 'quantity' should validate positive values
  Suggestion: Add CHECK constraint: quantity > 0

• order_items: Column 'unit_price' should validate positive values
  Suggestion: Add CHECK constraint: unit_price > 0

MISSING INDEXES (3 total)
-------------------------
• addresses.user_id (foreign_key)
  SQL: CREATE INDEX idx_addresses_user_id ON addresses (user_id);

• product_reviews.product_id (foreign_key)
  SQL: CREATE INDEX idx_product_reviews_product_id ON product_reviews (product_id);

• shopping_cart.user_id (foreign_key)
  SQL: CREATE INDEX idx_shopping_cart_user_id ON shopping_cart (user_id);

MERMAID ERD
===========
erDiagram
    USERS {
        INTEGER id "PK"
        VARCHAR(255) email "NOT NULL"
        VARCHAR(50) username "NOT NULL"
        VARCHAR(255) password_hash "NOT NULL"
        VARCHAR(100) first_name
        VARCHAR(100) last_name
        TIMESTAMP created_at
        TIMESTAMP updated_at
        VARCHAR(20) status
    }
    
    CATEGORIES {
        INTEGER id "PK"
        VARCHAR(100) name "NOT NULL"
        VARCHAR(100) slug "NOT NULL UNIQUE"
        INTEGER parent_id "FK"
        TEXT description
        BOOLEAN is_active
        INTEGER sort_order
        TIMESTAMP created_at
    }
    
    PRODUCTS {
        INTEGER id "PK"
        VARCHAR(255) name "NOT NULL"
        VARCHAR(50) sku "NOT NULL UNIQUE"
        TEXT description
        DECIMAL(10,2) price "NOT NULL"
        DECIMAL(10,2) cost
        DECIMAL(8,2) weight
        VARCHAR(50) dimensions
        INTEGER category_id "FK"
        VARCHAR(100) category_name
        VARCHAR(100) brand
        VARCHAR(500) tags
        INTEGER inventory_count
        INTEGER reorder_point
        VARCHAR(100) supplier_name
        VARCHAR(255) supplier_contact
        BOOLEAN is_active
        BOOLEAN featured
        TIMESTAMP created_at
        TIMESTAMP updated_at
    }
    
    ADDRESSES {
        INTEGER id "PK"
        INTEGER user_id "FK"
        VARCHAR(20) address_type
        VARCHAR(255) street_address "NOT NULL"
        VARCHAR(255) street_address_2
        VARCHAR(100) city "NOT NULL"
        VARCHAR(50) state "NOT NULL"
        VARCHAR(20) postal_code "NOT NULL"
        VARCHAR(50) country "NOT NULL"
        BOOLEAN is_default
        TIMESTAMP created_at
    }
    
    ORDERS {
        INTEGER id "PK"
        VARCHAR(50) order_number "NOT NULL UNIQUE"
        INTEGER user_id "FK"
        VARCHAR(255) user_email
        VARCHAR(200) user_name
        VARCHAR(50) status "NOT NULL"
        DECIMAL(10,2) total_amount "NOT NULL"
        DECIMAL(10,2) tax_amount "NOT NULL"
        DECIMAL(10,2) shipping_amount "NOT NULL"
        DECIMAL(10,2) discount_amount
        VARCHAR(50) payment_method
        VARCHAR(50) payment_status
        INTEGER shipping_address_id "FK"
        INTEGER billing_address_id "FK"
        VARCHAR(255) shipping_street
        VARCHAR(100) shipping_city
        VARCHAR(50) shipping_state
        VARCHAR(20) shipping_postal_code
        VARCHAR(50) shipping_country
        TEXT notes
        TIMESTAMP created_at
        TIMESTAMP updated_at
        TIMESTAMP shipped_at
        TIMESTAMP delivered_at
    }
    
    ORDER_ITEMS {
        INTEGER id "PK"
        INTEGER order_id "FK"
        INTEGER product_id "FK"
        VARCHAR(255) product_name
        VARCHAR(50) product_sku
        INTEGER quantity "NOT NULL"
        DECIMAL(10,2) unit_price "NOT NULL"
        DECIMAL(10,2) total_price "NOT NULL"
        TIMESTAMP created_at
    }
    
    SHOPPING_CART {
        INTEGER id "PK"
        INTEGER user_id "FK"
        VARCHAR(255) session_id
        INTEGER product_id "FK"
        INTEGER quantity "NOT NULL"
        TIMESTAMP added_at
        TIMESTAMP updated_at
    }
    
    PRODUCT_REVIEWS {
        INTEGER id "PK"
        INTEGER product_id "FK"
        INTEGER user_id "FK"
        INTEGER rating "NOT NULL"
        VARCHAR(200) title
        TEXT review_text
        BOOLEAN verified_purchase
        INTEGER helpful_count
        TIMESTAMP created_at
        TIMESTAMP updated_at
    }

    CATEGORIES ||--o{ CATEGORIES : has
    CATEGORIES ||--o{ PRODUCTS : has
    USERS ||--o{ ADDRESSES : has
    USERS ||--o{ ORDERS : has
    USERS ||--o{ SHOPPING_CART : has
    USERS ||--o{ PRODUCT_REVIEWS : has
    ADDRESSES ||--o{ ORDERS : has
    ORDERS ||--o{ ORDER_ITEMS : has
    PRODUCTS ||--o{ ORDER_ITEMS : has
    PRODUCTS ||--o{ SHOPPING_CART : has
    PRODUCTS ||--o{ PRODUCT_REVIEWS : has