# 数据库合并执行指南

## 概述
本指南帮助您将CollisionAvoidanceSystem的空间数据表安全地合并到QAUP-Management数据库中。

## 前提条件
- PostgreSQL 13+ 数据库
- 具有管理员权限的数据库用户
- QAUP-Management项目已正常运行

## 执行步骤

### 步骤1：数据库备份（必须）
```bash
# 备份QAUP数据库
pg_dump -h localhost -U your_username -d qaup > backup_$(date +%Y%m%d_%H%M%S).sql
```

### 步骤2：连接数据库
```bash
# 连接到QAUP数据库
psql -h localhost -U your_username -d qaup
```

### 步骤3：执行迁移脚本
```sql
-- 在psql命令行中执行：
\i sql/unified_database_migration.sql
```

### 步骤4：验证结果
执行脚本后，您应该看到以下输出：
```
==============================================
数据库迁移完成！
已成功合并CollisionAvoidanceSystem的空间数据表到QAUP-Management数据库
新增表：vehicle_locations, airport_areas, vehicle_trajectories, spatial_rules, rule_violation_events
新增视图：vehicle_complete_info, vehicle_status_summary
已启用PostGIS扩展支持空间数据操作
==============================================
```

### 步骤5：功能测试
```sql
-- 1. 测试PostGIS功能
SELECT PostGIS_Version();

-- 2. 检查新表
\dt vehicle_*
\dt airport_*
\dt spatial_*

-- 3. 测试空间查询
SELECT area_id, name, ST_AsText(boundary) 
FROM airport_areas 
LIMIT 1;

-- 4. 测试业务视图
SELECT * FROM vehicle_complete_info LIMIT 5;
```

## 合并后的数据库结构

### 原有表（QAUP-Management）
- `sys_vehicle_info` - 车辆基础信息
- `sys_driver_info` - 驾驶员信息  
- `sys_vehicle_type` - 车辆类型

### 新增表（来自CollisionAvoidanceSystem）
- `vehicle_locations` - 车辆实时位置（支持PostGIS空间查询）
- `airport_areas` - 机场区域空间数据
- `vehicle_trajectories` - 车辆历史轨迹
- `spatial_rules` - 空间安全规则引擎
- `rule_violation_events` - 规则违反事件记录

### 新增视图
- `vehicle_complete_info` - 车辆完整信息（基础信息+最新位置）
- `vehicle_status_summary` - 车辆实时状态统计

## 数据关联关系

车辆信息通过`vehicle_id`字段关联：
```sql
-- 基础信息表：sys_vehicle_info.vehicle_id (bigint)
-- 位置数据表：vehicle_locations.vehicle_id (varchar)
-- 关联方式：通过类型转换进行关联
```

## 常用查询示例

### 1. 查询车辆完整信息
```sql
SELECT 
    license_plate_number,
    brand,
    owning_unit,
    speed,
    ST_AsText(location) as current_position,
    last_location_time
FROM vehicle_complete_info 
WHERE license_plate_number = '京A12345';
```

### 2. 查询区域内的车辆
```sql
SELECT vl.vehicle_id, vl.speed, ST_AsText(vl.location)
FROM vehicle_locations vl
JOIN airport_areas aa ON ST_Within(vl.location, aa.boundary)
WHERE aa.area_id = 'RUNWAY_01'
AND vl.timestamp > NOW() - INTERVAL '10 minutes';
```

### 3. 查询规则违反事件
```sql
SELECT 
    event_id,
    rule_id,
    subject_id,
    violation_type,
    severity,
    ST_AsText(location) as violation_location,
    detected_at
FROM rule_violation_events 
WHERE detected_at > NOW() - INTERVAL '1 hour'
ORDER BY detected_at DESC;
```

## 注意事项

1. **数据类型差异**：原QAUP的`vehicle_id`是bigint，新表中是varchar，通过视图进行类型转换关联

2. **空间坐标系**：所有空间数据使用WGS84坐标系（SRID: 4326）

3. **性能优化**：已创建适当的空间索引（GIST）和常规索引

4. **时区处理**：新表使用`TIMESTAMP WITH TIME ZONE`，注意时区一致性

## 故障排除

### 问题1：PostGIS扩展安装失败
```sql
-- 检查PostgreSQL版本和PostGIS可用性
SELECT version();
SELECT name, default_version FROM pg_available_extensions WHERE name = 'postgis';
```

### 问题2：权限不足
确保数据库用户具有以下权限：
- CREATE EXTENSION
- CREATE TABLE
- CREATE INDEX
- CREATE TRIGGER

### 问题3：表已存在
脚本使用`CREATE TABLE IF NOT EXISTS`，可以安全重复执行。

## 回滚方案

如果需要回滚，执行以下脚本：
```sql
-- 删除新增的表和视图
DROP VIEW IF EXISTS vehicle_complete_info;
DROP VIEW IF EXISTS vehicle_status_summary;
DROP TABLE IF EXISTS rule_violation_events;
DROP TABLE IF EXISTS spatial_rules;
DROP TABLE IF EXISTS vehicle_trajectories;
DROP TABLE IF EXISTS airport_areas;
DROP TABLE IF EXISTS vehicle_locations;

-- 可选：移除PostGIS扩展（谨慎操作）
-- DROP EXTENSION IF EXISTS postgis CASCADE;
```

## 技术支持

如遇问题，请检查：
1. PostgreSQL日志文件
2. 数据库连接参数
3. 用户权限设置
4. PostGIS扩展安装状态 