# 数据库模型设计

> DDS-Section: 6. 数据模型设计
> DDS-Lines: L570-L778

## 设计决策

| 决策点 | 决策 | 理由 |
|:---|:---|:---|
| JSONB vs 分表 | 使用JSONB存储 | 1. 项目信息结构复杂但查询简单 2. 版本快照需完整存储 3. 减少JOIN提升性能 |
| 草稿存储位置 | project_versions表 | 统一版本管理，方便Diff比较 |
| 权限表位置 | rmdc-user-auth模块 | 统一权限管理，便于跨模块授权 |

## ER 图

```mermaid
erDiagram
    projects ||--o{ project_versions : has
    projects ||--o{ project_workflows : has
    projects ||--|| project_auth_configs : has
    
    projects {
        bigint id PK
        string project_id UK
        string name
        string namespace UK
        string lifecycle_status
        string certification_status
        bigint detail_filler_id
        string detail_filler_name
        int current_version
        jsonb basic_info
        jsonb deploy_business
        jsonb deploy_env
        jsonb deploy_middleware
        datetime created_at
        datetime updated_at
        datetime deleted_at
    }
    
    project_versions {
        bigint id PK
        string project_id FK
        int version
        string version_type
        bigint user_id
        string workflow_id
        jsonb snapshot_data
        string commit_message
        bigint committer_id
        string committer_name
        datetime created_at
        datetime updated_at
    }
    
    project_workflows {
        bigint id PK
        string project_id FK
        string workflow_id UK
        string workflow_type
        string status
        datetime created_at
    }
    
    project_auth_configs {
        bigint id PK
        string project_id FK
        string tier_one_secret
        int time_offset
        bool totp_enabled
        string auth_type
        int auth_days
        datetime created_at
        datetime updated_at
    }
```

## 表关系说明

| 关系 | 说明 |
|:---|:---|
| `projects` → `project_versions` | 一对多，一个项目有多个版本记录（含草稿） |
| `projects` → `project_workflows` | 一对多，一个项目可关联多个工单 |
| `projects` → `project_auth_configs` | 一对一，一个项目对应一个授权配置 |

## 字段说明

| 表 | 字段 | 说明 |
|:---|:---|:---|
| projects | lifecycle_status | INIT/DRAFTING/REVIEWING/RELEASED/MODIFYING/ARCHIVED |
| projects | certification_status | draft/pending/official |
| project_versions | version_type | official/fill_draft/modify_draft |
| project_versions | workflow_id | 关联 rmdc-work-procedure 模块的工单 ID |
| project_workflows | workflow_type | fill(填写)/modify(修改) |

## 主表 DDL - projects

```go
// Project 项目主表
type Project struct {
    ID                int64           `gorm:"primaryKey;autoIncrement" json:"id"`
    ProjectID         string          `gorm:"type:varchar(64);uniqueIndex;not null" json:"project_id"`
    Name              string          `gorm:"type:varchar(128);not null" json:"name"`
    Namespace         string          `gorm:"type:varchar(64);uniqueIndex;not null" json:"namespace"`
    
    // 生命周期状态
    LifecycleStatus   string          `gorm:"type:varchar(32);default:'INIT'" json:"lifecycle_status"`
    // 认证状态 (draft/pending/official)
    CertificationStatus string        `gorm:"type:varchar(32);default:'draft'" json:"certification_status"`
    
    // 当前正式版本号
    CurrentVersion    int             `gorm:"default:0" json:"current_version"`
    
    // 主版本数据 (使用JSONB存储)
    BasicInfo         json.RawMessage `gorm:"type:jsonb" json:"basic_info"`
    DeployBusiness    json.RawMessage `gorm:"type:jsonb" json:"deploy_business"`
    DeployEnv         json.RawMessage `gorm:"type:jsonb" json:"deploy_env"`
    DeployMiddleware  json.RawMessage `gorm:"type:jsonb" json:"deploy_middleware"`
    
    // 项目填写人
    DetailFillerID    int64           `json:"detail_filler_id"`
    DetailFillerName  string          `gorm:"type:varchar(64)" json:"detail_filler_name"`
    
    // 审计字段
    CreatedBy         int64           `json:"created_by"`
    CreatedByName     string          `gorm:"type:varchar(64)" json:"created_by_name"`
    
    common.BaseModel
}
```

## 版本表 DDL - project_versions

```go
// ProjectVersion 项目版本表 (含草稿)
type ProjectVersion struct {
    ID            int64           `gorm:"primaryKey;autoIncrement" json:"id"`
    ProjectID     string          `gorm:"type:varchar(64);index;not null" json:"project_id"`
    
    // 版本号 (正式版本递增, 草稿为0)
    Version       int             `gorm:"not null;default:0" json:"version"`
    
    // 版本类型: official/fill_draft/modify_draft
    VersionType   string          `gorm:"type:varchar(32);not null" json:"version_type"`
    
    // 草稿所属用户ID (仅草稿类型有值)
    UserID        int64           `gorm:"index" json:"user_id"`
    UserName      string          `gorm:"type:varchar(64)" json:"user_name"`
    
    // 关联工单ID (1:1关系)
    WorkflowID    string          `gorm:"type:varchar(64);index" json:"workflow_id"`
    
    // 完整快照数据
    SnapshotData  json.RawMessage `gorm:"type:jsonb" json:"snapshot_data"`
    
    // 变更信息
    CommitMessage string          `gorm:"type:varchar(255)" json:"commit_message"`
    CommitterID   int64           `json:"committer_id"`
    CommitterName string          `gorm:"type:varchar(64)" json:"committer_name"`
    
    CreatedAt     time.Time       `json:"created_at"`
    UpdatedAt     time.Time       `json:"updated_at"`
}
```

## 项目工单关联表 DDL - project_workflows

```go
// ProjectWorkflow 项目与工单关联表
type ProjectWorkflow struct {
    ID           int64     `gorm:"primaryKey;autoIncrement" json:"id"`
    ProjectID    string    `gorm:"type:varchar(64);index;not null" json:"project_id"`
    WorkflowID   string    `gorm:"type:varchar(64);uniqueIndex;not null" json:"workflow_id"`
    
    // 工单类型: fill(填写)/modify(修改)
    WorkflowType string    `gorm:"type:varchar(32);not null" json:"workflow_type"`
    
    // 工单状态 (冗余存储)
    Status       string    `gorm:"type:varchar(32)" json:"status"`
    
    CreatedAt    time.Time `json:"created_at"`
    UpdatedAt    time.Time `json:"updated_at"`
}
```

## 索引策略

| 表 | 索引 | 用途 |
|:---|:---|:---|
| projects | `UK: project_id` | 主键查询 |
| projects | `UK: namespace` | 唯一性约束 |
| project_versions | `IX: project_id` | 版本历史查询 |
| project_versions | `IX: workflow_id` | 工单关联查询 |
| project_workflows | `UK: workflow_id` | 工单唯一关联 |
| project_workflows | `IX: project_id` | 项目关联查询 |
