# 商城数据库快速部署指南

## 🚀 快速开始

### 第一步：创建数据库结构
```sql
-- 执行主数据库脚本
\i complete_mall_database.sql
```

### 第二步：插入测试数据
```sql
-- 执行模拟数据脚本
\i mock_data_insert.sql
```

## 📋 执行顺序

1. **complete_mall_database.sql** - 创建完整的数据库结构
2. **mock_data_insert.sql** - 插入测试数据（可选）

## 🔧 PostgreSQL 执行方式

### 方式一：psql 命令行
```bash
# 连接数据库
psql -h localhost -U your_username -d your_database

# 执行脚本
\i /path/to/complete_mall_database.sql
\i /path/to/mock_data_insert.sql
```

### 方式二：直接执行
```bash
psql -h localhost -U your_username -d your_database -f complete_mall_database.sql
psql -h localhost -U your_username -d your_database -f mock_data_insert.sql
```

## ☁️ Supabase 执行方式

### SQL Editor 执行
1. 登录 Supabase Dashboard
2. 进入 SQL Editor
3. 复制粘贴 `complete_mall_database.sql` 内容
4. 点击 Run 执行
5. 重复步骤执行 `mock_data_insert.sql`

### 注意事项
- Supabase 可能需要分段执行大型脚本
- 确保有足够的权限创建扩展和表

## 🧪 测试验证

### 验证数据库结构
```sql
-- 检查表是否创建成功
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'public' 
  AND table_name LIKE 'ml_%'
ORDER BY table_name;

-- 检查用户数据
SELECT COUNT(*) as user_count FROM public.ak_users;
SELECT COUNT(*) as profile_count FROM public.ml_user_profiles;
```

### 验证测试数据
```sql
-- 检查商品数据
SELECT COUNT(*) as product_count FROM public.ml_products;
SELECT COUNT(*) as sku_count FROM public.ml_product_skus;

-- 检查订单数据
SELECT COUNT(*) as order_count FROM public.ml_orders;
SELECT COUNT(*) as order_item_count FROM public.ml_order_items;

-- 检查用户角色分布
SELECT 
    user_type,
    COUNT(*) as count,
    CASE 
        WHEN user_type = 1 THEN '消费者'
        WHEN user_type = 2 THEN '商家'
        WHEN user_type = 3 THEN '配送员'
        WHEN user_type = 4 THEN '客服'
        WHEN user_type = 5 THEN '管理员'
    END as role_name
FROM public.ml_user_profiles 
GROUP BY user_type;
```

## 🎯 测试用户登录信息

### 管理员
- **用户名**: admin
- **邮箱**: admin@mall.com

### 商家
- **商家1**: merchant1 / merchant1@mall.com
- **商家2**: merchant2 / merchant2@mall.com

### 消费者  
- **用户1**: customer1 / customer1@mall.com
- **用户2**: customer2 / customer2@mall.com
- **用户3**: customer3 / customer3@mall.com

### 配送员
- **配送员1**: driver1 / driver1@mall.com
- **配送员2**: driver2 / driver2@mall.com

## 🔐 权限说明

### RLS (Row Level Security) 策略
- 已为所有用户数据表启用RLS
- 用户只能访问自己的数据
- 商家可以管理自己的商品和订单
- 详细权限请查看 `complete_mall_database.sql`

### 测试权限
```sql
-- 验证RLS策略
SET ROLE authenticated;
SET session.user_id = 'user-uuid-here';

-- 测试用户数据访问
SELECT * FROM public.ml_user_profiles;
SELECT * FROM public.ml_shopping_cart;
```

## 📊 性能优化验证

### 索引检查
```sql
-- 检查索引创建情况
SELECT 
    schemaname,
    tablename,
    indexname,
    indexdef
FROM pg_indexes 
WHERE schemaname = 'public' 
  AND tablename LIKE 'ml_%'
ORDER BY tablename, indexname;
```

### 查询性能测试
```sql
-- 测试商品搜索性能
EXPLAIN ANALYZE 
SELECT * FROM public.ml_products 
WHERE status = 1 
  AND name ILIKE '%iPhone%'
ORDER BY created_at DESC
LIMIT 20;

-- 测试用户订单查询性能
EXPLAIN ANALYZE
SELECT * FROM public.ml_orders 
WHERE user_id = 'some-user-id'
ORDER BY created_at DESC
LIMIT 10;
```

## 🚨 常见问题

### 1. 扩展创建失败
```
ERROR: permission denied to create extension "uuid-ossp"
```
**解决方案**: 确保数据库用户有 SUPERUSER 权限或请求管理员创建扩展

### 2. RLS策略错误
```
ERROR: syntax error at or near ","
```
**解决方案**: 确保使用的是修正后的 `complete_mall_database.sql` 脚本

### 3. 模拟数据插入失败
```
ERROR: insert or update on table violates foreign key constraint
```
**解决方案**: 确保先执行 `complete_mall_database.sql` 创建表结构

### 4. Supabase 脚本执行超时
**解决方案**: 将大型脚本分段执行，或在本地执行后同步

## 🔄 数据更新

### 清理测试数据
```sql
-- 清理模拟数据（保留表结构）
TRUNCATE TABLE public.ml_product_reviews CASCADE;
TRUNCATE TABLE public.ml_order_items CASCADE;
TRUNCATE TABLE public.ml_orders CASCADE;
TRUNCATE TABLE public.ml_shopping_cart CASCADE;
-- ... 其他表
```

### 重新插入数据
```sql
-- 重新执行模拟数据脚本
\i mock_data_insert.sql
```

## 📝 部署检查清单

- [ ] 数据库连接正常
- [ ] 扩展创建成功 (uuid-ossp, pg_stat_statements, btree_gin)
- [ ] 所有表创建成功 (21张 ml_ 表)
- [ ] 索引创建成功 (30+ 个索引)
- [ ] 触发器创建成功 (8个触发器)
- [ ] 函数创建成功 (10+ 个函数)
- [ ] 视图创建成功 (3个视图)
- [ ] RLS策略启用成功
- [ ] 测试数据插入成功
- [ ] 权限验证通过
- [ ] 性能测试通过

---

**部署完成后建议**: 运行基本的API测试，验证所有功能模块正常工作。
