Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/数据库设计/数据库模式/项目数据模型.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

7.6 KiB
Raw Blame History

项目数据模型

**本文档引用的文件** - [Project.h](file://h/Project.h) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [ProManager.h](file://h/ProManager.h) - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) - [database_modify.xml](file://Install/Geomative Studio/database_modify.xml)

目录

  1. 项目表结构
  2. 项目与测区关系
  3. 默认工程与默认测区实现机制
  4. 数据库字段演进历史
  5. 关键字段业务含义
  6. 数据验证规则与访问模式

项目表结构

项目表(project)是系统中用于存储工程基本信息的核心数据表。根据代码分析,该表包含以下字段:

字段名称 数据类型 约束 默认值 说明
ID AutoNumber 主键 自增 项目唯一标识
CN Text 唯一 项目编码(GUID
PRname Text 非空 项目名称
PRdesc Text 可为空 项目描述
location Text 可为空 项目位置
PRdate Date/Time 非空 当前日期 创建日期
duration Text 可为空 项目周期
PS Text 可为空 项目负责人
CS Text 可为空 客户名称
PM Text 可为空 项目经理
QAS Text 可为空 质量保证标准
standard Text 可为空 技术标准

Section sources

项目与测区关系

项目与测区之间存在一对多的关联关系。一个项目可以包含多个测区,但每个测区只能属于一个项目。这种关系通过外键 PRIDtz 表中实现。

在数据访问层,CProManager::ShowTzList 方法通过 PRID 字段查询指定项目下的所有测区,并在UI中展示。CProManager::GetDMS 方法根据句柄类型动态创建 CProjectCTestingZone 对象,实现项目与测区的统一管理。

erDiagram
project {
AutoNumber ID PK
Text CN UK
Text PRname
Text PRdesc
Text location
Date/Time PRdate
Text duration
Text PS
Text CS
Text PM
Text QAS
Text standard
}
tz {
AutoNumber ID PK
Number PRID FK
Text CN
Text TZname
Number TZtype
Date/Time Cdate
Text TZdesc
Text location
}
project ||--o{ tz : "包含"

Diagram sources

默认工程与默认测区实现机制

系统在创建新项目时会自动创建一个默认测区。该机制通过 CProManager::CreateProjectInDB 方法调用 InsertDefaultTzToProject 实现。

默认测区的特征如下:

  • TZtype 值为 3,表示默认测区
  • 名称为 "DefaultTestZone"
  • 描述和位置均为 "None"
  • 创建日期为 "1970-01-01"

在创建项目后,系统首先删除该工程下已存在的默认测区(防止重复),然后插入新的默认测区记录。此过程确保每个项目下仅存在一个默认测区。

flowchart TD
Start([创建项目]) --> CreateProject["执行CreateProjectInDB"]
CreateProject --> CheckExist["检查项目名称是否已存在"]
CheckExist --> |已存在| ShowError["显示错误信息"]
CheckExist --> |不存在| InsertProject["插入项目记录"]
InsertProject --> GetProjectID["获取项目ID"]
GetProjectID --> DeleteDefault["删除现有默认测区"]
DeleteDefault --> InsertDefault["插入默认测区"]
InsertDefault --> End([完成])

Diagram sources

数据库字段演进历史

根据《数据库字段修改记录.txt》文件,项目相关表的演进历史如下:

日期 变更内容 说明
2015-06-02 在 td1dcon、td2dcon、td3dcon 表中增加 bUse 字段 用于标记记录是否有效
2015-06-12 在 Td 表中增加 rect、rect_loc 字段,修改 Espace、Edistance 类型 支持测试任务的矩形区域记录
2017-09-12 在 project 和 tz 表中加入默认的工程和默认测区 核心变更:实现项目初始化机制
2017-09-18 在 device 表中增加 GPS 字段 增强设备定位功能
2017-09-25 在 td 表中添加 IsAutoGenerate 字段 标识任务是否自动生成

2017年9月12日的变更是项目数据模型的重要里程碑,它引入了默认工程和默认测区的概念,简化了项目创建流程,确保了新项目具有基本的结构完整性。

Section sources

关键字段业务含义

项目名称 (PRname)

  • 业务含义:项目的可读名称,用于用户识别
  • 约束:必须唯一,不能为空
  • 验证规则:创建时检查是否已存在同名项目

创建时间 (PRdate)

  • 业务含义:项目创建的日期
  • 格式YYYY-MM-DD
  • 默认值:系统当前日期

坐标系统 (CS)

  • 业务含义:项目使用的坐标参考系统
  • 示例值WGS84、CGCS2000
  • 用途:确保测量数据的空间参考一致性

项目编码 (CN)

  • 业务含义:项目的唯一标识编码
  • 生成方式:使用 GUID 生成器创建
  • 特点:全局唯一,用于跨系统数据同步

测区类型 (TZtype)

  • 业务含义:测区的分类标识
  • 关键值
    • 3:默认测区
    • 其他值:具体测区类型
  • 验证:创建默认测区时严格校验类型值

Section sources

数据验证规则与访问模式

数据验证规则

  1. 项目名称唯一性验证:在 CreateProjectInDB 中通过查询 project 表检查名称冲突
  2. 默认测区类型验证:在 CreateDefaultTzInDev 中校验 TZtype 必须为 3
  3. 必填字段验证PRnamePRdate 等字段在数据库层面设置为非空
  4. 日期格式验证:使用 Format(PRdate,'YYYY-MM-DD') 确保日期格式统一

访问模式

系统采用句柄(Handle)机制管理项目和测区对象:

  • 使用 m_handleProcessor.GenerateHandle 生成唯一句柄
  • 通过 GetDMS 方法根据句柄获取对应的 CProjectCTestingZone 对象
  • 对象缓存在 m_dmsLinkList 链表中,提高访问效率

数据访问遵循以下模式:

  1. 通过句柄获取对象
  2. 执行业务逻辑
  3. 操作结果持久化到数据库
  4. 更新缓存状态
sequenceDiagram
participant UI as 用户界面
participant PM as CProManager
participant DB as 数据库
participant Cache as 对象缓存
UI->>PM : 请求显示项目列表
PM->>DB : 查询dptt表获取项目ID
DB-->>PM : 返回项目ID列表
loop 每个项目ID
PM->>DB : 查询project表获取详细信息
DB-->>PM : 返回项目数据
PM->>Cache : 检查对象是否已缓存
alt 对象存在
Cache-->>PM : 返回缓存对象
else 对象不存在
PM->>PM : 创建CProject对象
PM->>Cache : 添加到缓存
end
PM->>UI : 返回项目信息
end

Diagram sources