1. 材料数据库结构设计与SQLite建库

材料数据库结构设计与SQLite建库 学习卡片

为什么材料实验数据需要结构化建库

材料实验数据天然分散:成分记录在Excel、工艺参数写在实验本、结构表征结果存于仪器软件、性能测试数据又在另一张表。字段命名不统一(如"抗拉强度"与"σb"、"温度"与"T")导致后续清洗和建模成本极高。本案例用SQLite建立一张材料实验主表,把成分、工艺、结构、性能四类字段统一到同一记录中,并通过约束保证数据质量。

材料实验数据库表结构(materials 主表) materials 表 成分字段 material_id TEXT PK alloy_name TEXT fe_wt% REAL cr_wt% REAL ni_wt% REAL 工艺字段 process_route TEXT solution_temp REAL aging_temp REAL aging_time_h REAL cooling_rate TEXT 结构字段 phase TEXT grain_size_um REAL porosity_pct REAL texture TEXT 性能字段 yield_strength_MPa REAL tensile_strength_MPa REAL elongation_pct REAL hardness_HV REAL test_temp_C REAL test_standard TEXT data_source TEXT created_at TEXT 约束:material_id 主键唯一 · 成分/性能字段 NOT NULL · 数值字段 CHECK 范围 · 单位统一写入字段名后缀

建库SQL与约束设计

以下SQLite脚本完成建库、建表和约束设置。字段命名采用物理量_单位后缀(如 yield_strength_MPa),从命名层面消除单位歧义;数值字段用 CHECK 约束拦截明显异常值(如负强度、孔隙率超过100%)。

-- 1. 创建数据库并启用外键支持
PRAGMA foreign_keys = ON;

-- 2. 材料实验主表
CREATE TABLE IF NOT EXISTS materials (
    material_id          TEXT PRIMARY KEY,
    alloy_name           TEXT NOT NULL,
    fe_wt%               REAL CHECK (fe_wt% >= 0 AND fe_wt% <= 100),
    cr_wt%               REAL CHECK (cr_wt% >= 0 AND cr_wt% <= 100),
    ni_wt%               REAL CHECK (ni_wt% >= 0 AND ni_wt% <= 100),
    process_route        TEXT,
    solution_temp        REAL CHECK (solution_temp > 0),
    aging_temp           REAL CHECK (aging_temp > 0),
    aging_time_h         REAL CHECK (aging_time_h >= 0),
    cooling_rate         TEXT,
    phase                TEXT,
    grain_size_um        REAL CHECK (grain_size_um > 0),
    porosity_pct         REAL CHECK (porosity_pct >= 0 AND porosity_pct <= 100),
    texture              TEXT,
    yield_strength_MPa   REAL CHECK (yield_strength_MPa > 0),
    tensile_strength_MPa REAL CHECK (tensile_strength_MPa > 0),
    elongation_pct       REAL CHECK (elongation_pct >= 0),
    hardness_HV          REAL CHECK (hardness_HV > 0),
    test_temp_C          REAL,
    test_standard        TEXT,
    data_source          TEXT,
    created_at           TEXT DEFAULT (datetime('now'))
);

-- 3. 常用查询索引
CREATE INDEX IF NOT EXISTS idx_alloy ON materials(alloy_name);
CREATE INDEX IF NOT EXISTS idx_phase ON materials(phase);
SQLite中字段名含 % 需用双引号包裹,如 "fe_wt%"。若希望避免转义,可改用 fe_wt_pct 命名。本案例为保持与实验记录一致,保留 % 写法。

样例数据导入与验证

插入3条教学示例数据(非实测值,仅用于演示字段完整性和约束效果),覆盖不同工艺路线与相组成。

INSERT INTO materials
(material_id, alloy_name, "fe_wt%", "cr_wt%", "ni_wt%",
 process_route, solution_temp, aging_temp, aging_time_h, cooling_rate,
 phase, grain_size_um, porosity_pct, texture,
 yield_strength_MPa, tensile_strength_MPa, elongation_pct, hardness_HV,
 test_temp_C, test_standard, data_source)
VALUES
('M001', '316L', 68.0, 17.0, 12.0,
 '固溶+时效', 1050, 650, 4.0, '水淬',
 '奥氏体', 25.0, 0.5, '随机',
 280, 580, 45.0, 180,
 25, 'GB/T 228.1', '实验记录A'),
('M002', '17-4PH', 75.0, 16.0, 4.0,
 '固溶+时效', 1040, 480, 1.0, '空冷',
 '马氏体+析出相', 15.0, 0.2, '随机',
 1100, 1200, 12.0, 380,
 25, 'GB/T 228.1', '实验记录B'),
('M003', '304', 70.0, 19.0, 9.0,
 '固溶', 1080, NULL, NULL, '水淬',
 '奥氏体', 30.0, 0.8, '随机',
 250, 520, 50.0, 160,
 25, 'GB/T 228.1', '实验记录C');

验证约束是否生效:尝试插入一条屈服强度为负的记录,应被 CHECK 拦截。

-- 预期报错:CHECK constraint failed
INSERT INTO materials (material_id, alloy_name, yield_strength_MPa)
VALUES ('M999', 'BadSample', -100);

查询验证:按相组成统计平均抗拉强度,确认数据可正常聚合。

SELECT phase,
       COUNT(*) AS n,
       ROUND(AVG(tensile_strength_MPa), 1) AS avg_uts
FROM materials
GROUP BY phase;
预期结果:奥氏体相2条记录,平均抗拉强度约550 MPa;马氏体+析出相1条记录,抗拉强度1200 MPa。该结果由上述示例数据直接计算得出,用于验证建库与查询链路通畅。

字段设计检查清单

检查项要求本案例做法
主键唯一性每条实验记录可唯一标识material_id TEXT PRIMARY KEY
单位一致性字段名或注释明确单位字段名后缀 _MPa / _pct / _um / _C
数值范围拦截物理上不可能的取值CHECK 约束(如强度>0,孔隙率0~100)
必填字段核心标识不可为空alloy_name NOT NULL
可追溯性记录数据来源与时间data_source + created_at 默认时间戳
查询效率常用筛选字段有索引alloy_name、phase 建索引
SQLite对 CHECK 约束的校验发生在插入/更新时,已有数据不会因后续修改表结构而自动重新校验。若后期调整约束,需重建表并迁移数据。此外,SQLite默认不启用外键,需每次连接执行 PRAGMA foreign_keys = ON;。