
1) 【一句话结论】设计一个名为“航行日志”的主表,通过主键(日志ID)和字段约束(非空、范围、枚举)确保数据完整性,字段涵盖航行时间、船位、航向、航速、天气、设备状态,满足航行记录的查询与追溯需求。
2) 【原理/概念讲解】数据库表设计遵循“实体-关系”模型,核心是“字段-类型-约束”三要素。以“航行日志”为例:
DATETIME存储精确时间(如2024-05-10 08:30:00),支持按时间排序/计算时间差,类比“日记的日期栏”,必须填写且唯一标识时间点;VARCHAR存储经纬度字符串(如30.12°N,120.56°E),非空,记录当前位置,类似“日记的地址栏”;INT(范围0-360度),约束角度合理性;航速用DECIMAL(5,2)(如12.5节),保留两位小数,避免精度丢失,类似“日记的数字记录(如温度、速度)”;VARCHAR记录描述(如“晴,风速5级”),设备状态用ENUM(如'正常'、'故障'、'维护中'),规范状态输入,减少错误,类似“日记的备注栏”。3) 【对比与适用场景】
| 字段类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 航行时间 | DATETIME | 精确到秒,支持时间排序 | 记录日志时间戳 | 需考虑时区(如UTC),避免时差错误 |
| 船位 | VARCHAR(50) 或 GEOMETRY(POINT) | 存储经纬度字符串/空间坐标 | 查询位置轨迹 | 若用空间数据需数据库支持(如PostgreSQL的PostGIS) |
| 航向 | INT | 整数表示度数 | 记录航向角度 | 约束范围0-360,确保数据有效性 |
| 航速 | DECIMAL(5,2) | 5位总位数,2位小数 | 精确记录速度 | 避免精度丢失,如12.5节 vs 13节 |
| 天气 | VARCHAR(100) | 文本描述天气情况 | 记录环境信息 | 长度足够存储复杂描述 |
| 设备状态 | ENUM('正常','故障','维护中') 或 VARCHAR(20) | 枚举/文本记录状态 | 记录设备运行状态 | 枚举更规范,减少输入错误 |
4) 【示例】(MySQL表结构)
CREATE TABLE 航行日志 (
日志ID INT AUTO_INCREMENT PRIMARY KEY,
航行时间 DATETIME NOT NULL,
船位 VARCHAR(50) NOT NULL COMMENT '经纬度,如"30.1234°N,120.5678°E"',
航向 INT NOT NULL CHECK (航向 BETWEEN 0 AND 360),
航速 DECIMAL(5,2) NOT NULL CHECK (航速 >= 0),
天气 VARCHAR(100) NOT NULL,
设备状态 VARCHAR(20) NOT NULL CHECK (设备状态 IN ('正常','故障','维护中'))
);
5) 【面试口播版答案】(约80秒)
“面试官您好,针对船舶航行日志的数据库表结构设计,我设计一个名为‘航行日志’的主表,核心字段包括航行时间、船位、航向、航速、天气、设备状态。具体来说:
DATETIME类型,非空,记录精确时间,方便按时间排序查询;VARCHAR存储经纬度字符串(如“30.12°N,120.56°E”),非空,记录当前位置;INT类型,范围0-360度,非空,约束角度合理;DECIMAL(5,2)类型,非空,保留两位小数,精确记录速度;VARCHAR存储描述,非空,记录环境信息;6) 【追问清单】
ENUM类型(如'正常'、'故障'、'维护中'),减少输入错误,提高数据规范性。DATETIME(6)或TIMESTAMP(6),但通常秒级足够满足航行日志的查询需求。VARCHAR),但当前用文本描述更直观,便于操作人员理解。7) 【常见坑/雷区】
VARCHAR)而非时间戳(DATETIME/TIMESTAMP),导致无法按时间排序或计算时间差。INT)而非小数(DECIMAL),丢失速度精度,无法准确记录变化。GEOMETRY类型,否则只能存储字符串,影响空间查询效率。