# 数据库模式 **本文档引用的文件** - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) - [database_modify.xml](file://Install/Geomative Studio/database_modify.xml) - [Project.h](file://h/Project.h) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp) - [Script.cpp](file://cpp/ProblemZone/Script.cpp) - [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp) - [GeoMative.rc](file://GeoMative.rc) - [Resource.h](file://Resource.h) ## 目录 1. [引言](#引言) 2. [核心实体表结构](#核心实体表结构) 3. [数据库关系与ER图](#数据库关系与er图) 4. [关键字段业务含义与验证规则](#关键字段业务含义与验证规则) 5. [数据库版本演进历史](#数据库版本演进历史) 6. [结论](#结论) ## 引言 本文档旨在全面描述Geomative Studio软件所使用的Access数据库的结构。基于`DB/数据库字段修改记录.txt`文件的详细记录,本文档将深入分析项目、设备、脚本、测量数据等核心实体的表结构,包括字段名称、数据类型、主键/外键约束、索引和默认值。文档将解释各表之间的关系(如一对多、多对多等)并提供实体关系图(ER图)进行可视化表示。此外,文档还将包含数据库版本的演进历史和字段变更记录,并说明不同版本间的兼容性处理策略。 **Section sources** - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) ## 核心实体表结构 本节详细描述数据库中核心实体的表结构。信息主要来源于`IOManager.cpp`文件中创建数据库表的代码,以及`Project.cpp`、`Device.cpp`等文件中查询数据的SQL语句。 ### 项目 (Project) 表 `project`表存储了工程项目的元数据。 **表结构:** | 字段名称 | 数据类型 | 是否可为空 | 说明 | | :--- | :--- | :--- | :--- | | `ID` | AutoNumber | 否 | 主键,自增ID | | `CN` | 文本 (40) | 否 | 项目ID | | `PRname` | 文本 (20) | 否 | 项目名称 | | `PRdesc` | 文本 (50) | 是 | 备注 | | `location` | 文本 (50) | 是 | 位置 | | `PRdate` | 日期/时间 | 是 | 日期 | | `duration` | 长整型 | 是 | 持续时间(天) | | `PS` | 文本 (20) | 是 | 项目主管 | | `CS` | 文本 (20) | 是 | 现场经理 | | `PM` | 文本 (20) | 是 | 项目经理 | | `QAS` | 文本 (20) | 是 | QA | | `standard` | 文本 (20) | 是 | 标准 | **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L227-L237) - [Project.cpp](file://cpp/ProblemZone/Project.cpp#L30) - [GeoMative.rc](file://GeoMative.rc#L3835-L3850) ### 设备 (Device) 表 `device`表存储了设备的硬件和配置信息。 **表结构:** | 字段名称 | 数据类型 | 是否可为空 | 说明 | | :--- | :--- | :--- | :--- | | `ID` | AutoNumber | 否 | 主键,自增ID | | `DEname` | 文本 (20) | 否 | 设备名称 | | `modelNO` | 文本 (20) | 否 | 型号 | | `SN` | 文本 (20) | 否 | 序列号 | | `HWV` | 文本 (20) | 否 | 硬件版本 | | `SWV` | 文本 (20) | 否 | 软件版本 | | `Mdate` | 日期/时间 | 是 | 生产日期 | | `Mbatch` | 文本 (20) | 是 | 批次号 | | `GPS` | 文本 (50) | 是 | GPS信息(2017.9.18新增) | **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L366-L375) - [Device.cpp](file://cpp/ProblemZone/Device.cpp#L135) ### 脚本 (Script) 表 `scon`表(在代码中常被称为`script`)存储了测量任务的配置脚本。 **表结构:** | 字段名称 | 数据类型 | 是否可为空 | 说明 | | :--- | :--- | :--- | :--- | | `ID` | AutoNumber | 否 | 主键,自增ID | | `CN` | 文本 (40) | 否 | 脚本ID | | `Sname` | 文本 (20) | 否 | 阵列名称 | | `Eamount` | 整型 | 是 | 电极数量 | | `CHamount` | 整型 | 是 | 通道数量 | | `TPamount` | 整型 | 是 | 点数 | | `definer` | 文本 (20) | 是 | 操作员 | | `DEdate` | 日期/时间 | 是 | 创建日期 | | `SCdesc` | 文本 (50) | 是 | 备注 | | `Rect` | 文本 | 是 | 矩形大小(2015.6.12新增) | | `RectLoc` | 文本 | 是 | 矩形位置(2015.6.12新增) | | `PoleDistance` | 文本 | 是 | 电极间距(2015.6.12新增) | | `PoleStep` | 文本 | 是 | 电极步长(2015.6.12新增) | **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L564-L586) - [Script.cpp](file://cpp/ProblemZone/Script.cpp#L18) ### 测量数据 (Measurement Data) 表 `td`表是存储测量任务的核心表,它与多种具体测量数据表(如`td1dcon`, `td2dcon`, `td3dcon`)存在一对多关系。 **表结构:** | 字段名称 | 数据类型 | 是否可为空 | 说明 | | :--- | :--- | :--- | :--- | | `ID` | AutoNumber | 否 | 主键,自增ID | | `TDname` | 文本 (20) | 否 | 任务名称 | | `Tlocation` | 文本 (50) | 是 | 测区位置 | | `DESN` | 文本 (20) | 否 | 设备序列号 | | `SCCN` | 文本 (40) | 否 | 脚本ID | | `Sname` | 文本 (20) | 否 | 阵列名称 | | `Stype` | 整型 | 是 | 阵列类型 | | `Ttype` | 整型 | 是 | 测试方法 | | `Tmode` | 整型 | 是 | 测试模式 | | `Eamount` | 整型 | 是 | 电极数量 | | `TPamount` | 整型 | 是 | 点数 | | `CHamount` | 整型 | 是 | 通道数量 | | `N` | 整型 | 是 | 堆叠次数 | | `TRwave` | 整型 | 是 | 发射波形 | | `TRfrequency` | 整型 | 是 | 发射频率 | | `Ifrequency` | 整型 | 是 | 发射频率 | | `SAfrequency` | 整型 | 是 | 采样频率 | | `Clayout` | 整型 | 是 | 装置类型 | | `Espace` | 文本 | 是 | 电极间距(2015.6.12由数字改为文本) | | `Edistance` | 文本 | 是 | 电极距离(2015.6.12由数字改为文本) | | `weather` | 整型 | 是 | 天气 | | `WDIR` | 整型 | 是 | 风向 | | `temperature` | 整型 | 是 | 温度 | | `height` | 整型 | 是 | 高度 | | `humidity` | 整型 | 是 | 湿度 | | `Cdate` | 日期/时间 | 是 | 创建日期 | | `Ctime` | 日期/时间 | 是 | 创建时间 | | `Tdate` | 日期/时间 | 是 | 测试日期 | | `Ttime` | 日期/时间 | 是 | 测试时间 | | `Rdirection` | 整型 | 是 | 电阻率方向 | | `CRtime` | 整型 | 是 | 堆叠时间 | | `PM` | 文本 (10) | 是 | 项目经理 | | `OP` | 文本 (10) | 是 | 操作员 | | `QA` | 文本 (10) | 是 | QA | | `rect` | 文本 | 是 | 矩形大小(2015.6.12新增) | | `rect_loc` | 文本 | 是 | 矩形位置(2015.6.12新增) | | `SkipCable` | 整型 | 是 | 跳过电缆(2017.9.18新增) | | `IsAutoGenerate` | 整型 | 是 | 是否自动生成(2017.9.25新增) | | `TZID` | 长整型 | 是 | 测区ID(外键) | **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L369-L397) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L438-L440) ### 测量数据详情表 `td1dcon`, `td2dcon`, `td3dcon`等表存储了具体的测量数据点,与`td`表通过`TCHID`或`TSN`关联。 **通用字段结构 (以td2dcon为例):** | 字段名称 | 数据类型 | 是否可为空 | 说明 | | :--- | :--- | :--- | :--- | | `ID` | AutoNumber | 否 | 主键,自增ID | | `TSN` | 整型 | 否 | 任务序列号 | | `TCHID` | 长整型 | 否 | 通道ID | | `V` | 单精度浮点型 | 是 | 电压 | | `I` | 单精度浮点型 | 是 | 电流 | | `R0` | 单精度浮点型 | 是 | 电阻 | | `SP` | 单精度浮点型 | 是 | 自电 | | `bUse` | 是/否 | 是 | 记录是否有效(2015.6.2新增) | | `Vrawdata` | 备注 | 是 | 原始电压数据 | | `Irawdata` | 备注 | 是 | 原始电流数据 | **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L410-L435) - [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L55-L57) ## 数据库关系与ER图 根据对代码的分析,数据库中的核心实体存在以下关系: * **项目 (Project)** 与 **测区 (Tz)** 之间存在一对多关系。一个项目可以包含多个测区。 * **测区 (Tz)** 与 **测量任务 (Td)** 之间存在一对多关系。一个测区可以包含多个测量任务。 * **设备 (Device)** 与 **测量任务 (Td)** 之间存在一对多关系。一台设备可以执行多个测量任务。 * **脚本 (Scon)** 与 **测量任务 (Td)** 之间存在一对多关系。一个脚本可以被多个测量任务使用。 * **测量任务 (Td)** 与 **测量数据详情 (Td1dcon, Td2dcon, Td3dcon)** 之间存在一对多关系。一个测量任务包含多个数据点。 ```mermaid erDiagram PROJECT { AutoNumber ID PK string CN UK string PRname string PRdesc string location datetime PRdate long duration string PS string CS string PM string QAS string standard } DEVICE { AutoNumber ID PK string DEname string modelNO string SN UK string HWV string SWV datetime Mdate string Mbatch string GPS } SCON { AutoNumber ID PK string CN UK string Sname int Eamount int CHamount int TPamount string definer datetime DEdate string SCdesc string Rect string RectLoc string PoleDistance string PoleStep } TZ { AutoNumber ID PK string CN string TZname string location datetime Cdate datetime Ctime long PROID FK } TD { AutoNumber ID PK string TDname string Tlocation string DESN FK string SCCN FK string Sname int Stype int Ttype int Tmode int Eamount int TPamount int CHamount int N int TRwave int TRfrequency int Ifrequency int SAfrequency int Clayout string Espace string Edistance int weather int WDIR int temperature int height int humidity datetime Cdate datetime Ctime datetime Tdate datetime Ttime int Rdirection int CRtime string PM string OP string QA string rect string rect_loc int SkipCable int IsAutoGenerate long TZID FK } TD1DCON { AutoNumber ID PK int TSN long TCHID float V float I float R0 float SP boolean bUse memo Vrawdata memo Irawdata } TD2DCON { AutoNumber ID PK int TSN long TCHID float V float I float R0 float SP boolean bUse memo Vrawdata memo Irawdata } TD3DCON { AutoNumber ID PK int TSN long TCHID float V float I float R0 float SP boolean bUse memo Vrawdata memo Irawdata } PROJECT ||--o{ TZ : "包含" TZ ||--o{ TD : "包含" DEVICE ||--o{ TD : "执行" SCON ||--o{ TD : "使用" TD ||--o{ TD1DCON : "包含" TD ||--o{ TD2DCON : "包含" TD ||--o{ TD3DCON : "包含" ``` **Diagram sources ** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp) ## 关键字段业务含义与验证规则 本节列举核心表中关键字段的业务含义和可能的数据验证规则。 ### 项目 (Project) 表 * **`CN` (项目ID):** 项目的唯一标识符。业务规则要求其在系统内必须唯一。 * **`PRname` (项目名称):** 项目的名称,用于用户识别。不能为空。 * **`PRdate` (日期):** 项目创建的日期,用于时间排序和报告生成。 * **`PS`, `CS`, `PM`, `QAS` (人员):** 记录项目相关人员,用于责任追溯。 ### 设备 (Device) 表 * **`SN` (序列号):** 设备的唯一硬件标识符。业务规则要求其在系统内必须唯一。 * **`Mdate` (生产日期):** 设备的生产日期,用于设备生命周期管理。 ### 脚本 (Scon) 表 * **`CN` (脚本ID):** 脚本的唯一标识符。业务规则要求其在系统内必须唯一。 * **`Eamount` (电极数量):** 定义了测量阵列中使用的电极总数。必须为正整数。 * **`CHamount` (通道数量):** 定义了测量任务中使用的通道数量。必须为正整数。 ### 测量任务 (Td) 表 * **`TDname` (任务名称):** 测量任务的名称,用于用户识别。不能为空。 * **`Ttype` (测试方法):** 一个整型代码,通过`cm`表(代码映射表)关联到具体的测试方法名称(如“电阻率”、“激电”等)。 * **`Clayout` (装置类型):** 一个整型代码,通过`cm`表关联到具体的装置名称(如“温纳”、“施伦贝谢”等)。 * **`Espace` / `Edistance` (电极间距/距离):** 存储为文本类型,可能包含单位信息(如"5m"),提供了更大的灵活性。 **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp) ## 数据库版本演进历史 根据`DB/数据库字段修改记录.txt`文件,数据库经历了多次重要的结构变更。以下是按时间顺序整理的版本演进历史: | 日期 | 变更内容 | 变更类型 | 兼容性说明 | | :--- | :--- | :--- | :--- | | 2015年6月2日 | 在`td1dcon`, `td2dcon`, `td3dcon`表中增加`bUse`字段,用于标记记录是否有效。 | 新增字段 | 向后兼容。旧数据的`bUse`字段默认为`True`(有效)。 | | 2015年6月12日 | 1. 在`Td`表中增加`rect`和`rect_loc`字段。
2. 将`Td`表的`Espace`和`Edistance`字段从数字类型改为文本类型。
3. 在`scon`表中增加`Rect`, `RectLoc`, `PoleDistance`, `PoleStep`字段,并删除旧的`X0\Y0\X1\Y1`字段。 | 新增字段
修改字段类型
新增/删除字段 | 向后兼容。旧数据的`rect`和`rect_loc`为空。`Espace`和`Edistance`的数值被转换为字符串。旧的坐标字段被废弃。 | | 2016年12月2日 | 1. 在`ac`, `acds`, `td_spc_attr`表中新增10个时窗的信息。
2. 在`cm`表中加入发射频率为9(0.03125Hz)。 | 新增字段
新增数据 | 向后兼容。新时窗字段在旧数据中为空。 | | 2017年9月12日 | 在`project`以及`tz`表中加入默认的工程和默认测区。 | 新增数据 | 向后兼容。不影响现有数据。 | | 2017年9月18日 | 1. 在`device`表中增加`GPS`字段。
2. 在`desetting`表中增加`CableType`, `LowPowerAlarm`, `AutoStack`字段。
3. 将`gr`表中的`ECODE`属性从文本改成整型。
4. 在`td`表中增加`SkipCable`字段。
5. 将`td`表中的`DESN`属性从必填改为非必填。 | 新增字段
修改字段类型
修改字段约束 | 向后兼容。`GPS`等新字段在旧设备记录中为空。`ECODE`的文本值被转换为对应的整型代码。`DESN`字段可为空。 | | 2017年9月23日 | 新增`task_timer`表。 | 新增表 | 向后兼容。该表用于新功能,不影响旧数据。 | | 2017年9月25日 | 在`td`表中添加`IsAutoGenerate`字段。 | 新增字段 | 向后兼容。旧任务的该字段为`False`。 | | 2017年9月26日 | 在`timer_task`表中增加`PLCID`字段。 | 新增字段 | 向后兼容。 | | 2017年9月28日 | 将`td1d/2d/3ddcon`表中的`V,I,R0,SP`的字段属性都改为非必填字段。 | 修改字段约束 | 向后兼容。允许存储不完整的测量数据。 | | 2019年7月4日 | `medium`表新增加强梯度装置。 | 新增数据 | 向后兼容。 | | 2019年7月14日 | 1. `medium`表新增跨孔装置。
2. 新增`TTaskInfoCoordinetes`表,用于保存电极坐标信息。 | 新增数据
新增表 | 向后兼容。 | | 2019年12月3日 | 新增`TPictureInfo`和`TPictureCode`表,用于存放图片和二维码信息。 | 新增表 | 向后兼容。 | | 2019年12月11日 | 新增`TLoggingTaskInfo`和`TLoggingTaskContent`表,用于支持测井功能。 | 新增表 | 向后兼容。 | **Section sources** - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) ## 结论 本文档基于对Geomative Studio项目代码和数据库变更记录的分析,全面描述了其Access数据库的模式。数据库设计围绕“项目-测区-任务-数据”的核心流程,通过清晰的表结构和关系来管理地质勘探数据。数据库经历了从2015年至今的持续演进,通过新增字段、修改类型和增加新表的方式,不断扩展功能以支持新的测量方法和设备特性。所有变更都遵循了向后兼容的原则,确保了旧版数据在新版软件中的可用性。`cm`表作为核心的代码映射表,为系统提供了良好的可配置性和多语言支持能力。