You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库设计优化需求:存储Filename、Testname及多Build测试结果

完全理解你的顾虑——每个Build单独建表的设计简直是维护噩梦,不仅扩展性差,写查询的时候也会头疼。咱们来重构一个更合理的关系型数据库设计方案,符合第三范式,还能灵活应对后续需求。

优化后的数据库设计方案

核心思路

摒弃“每个Build一张表”的反模式,改用三张核心表来关联所有数据,既保证数据一致性,又能轻松扩展查询。

1. 文件与测试映射表(file_test_mapping)

保留你原本的一对一关系,但优化结构和约束,让数据更严谨:

CREATE TABLE file_test_mapping (
    test_id INT PRIMARY KEY AUTO_INCREMENT, -- 用自增ID作为主键,比直接用Testname更高效灵活
    test_name VARCHAR(255) NOT NULL UNIQUE, -- 确保测试名全局唯一
    filename VARCHAR(255) NOT NULL UNIQUE -- 确保文件名全局唯一,严格执行一对一关系
);
  • 用test_id做主键,关联其他表时性能更好,也避免了测试名变更带来的连锁问题
  • 双重UNIQUE约束,从数据库层面保证“一个文件对应一个测试”的规则

2. Build信息表(builds)

给Build添加唯一标识,同时可扩展额外信息:

CREATE TABLE builds (
    build_id INT PRIMARY KEY AUTO_INCREMENT,
    build_number VARCHAR(255) NOT NULL UNIQUE, -- 比如Build_123、Build_234
    build_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP -- 可选:记录Build创建时间,方便按时间排序查询
);

3. 测试执行结果表(test_results)

这是核心改进点——把所有Build的测试结果集中存储,用外键关联前两张表:

CREATE TABLE test_results (
    result_id INT PRIMARY KEY AUTO_INCREMENT,
    test_id INT NOT NULL,
    build_id INT NOT NULL,
    executed ENUM('Y', 'N') NOT NULL, -- 标记该测试是否在当前Build中执行
    passed ENUM('Y', 'N') NOT NULL, -- 标记测试结果是Pass还是Fail
    FOREIGN KEY (test_id) REFERENCES file_test_mapping(test_id),
    FOREIGN KEY (build_id) REFERENCES builds(build_id),
    UNIQUE KEY unique_test_build (test_id, build_id) -- 确保同一个测试在同一个Build里只有一条结果
);
  • unique_test_build唯一键:避免重复记录同一测试在同一Build中的结果
  • 外键约束:保证不会出现不存在的测试或Build,维护数据完整性

为什么这个设计更优?

  • 扩展性拉满:新增Build时不用再建表,直接往builds和test_results插数据即可,哪怕后续有几百上千个Build也能轻松应对
  • 查询灵活便捷:比如要查某个测试在所有Build中的结果,或者某个Build里所有测试的情况,SQL写起来非常简单:
    -- 查询Testname=1在所有Build中的执行结果
    SELECT b.build_number, tr.executed, tr.passed
    FROM test_results tr
    JOIN builds b ON tr.build_id = b.build_id
    JOIN file_test_mapping ftm ON tr.test_id = ftm.test_id
    WHERE ftm.test_name = '1';
    
  • 维护成本极低:不用管理几十上百张零散的Build表,索引、约束都能统一配置和维护

示例数据插入

对应你原来的示例数据,插入方式如下:

  1. 插入文件与测试映射:
INSERT INTO file_test_mapping (test_name, filename) VALUES ('1', 'A.txt'), ('2', 'Er.txt');
  1. 插入Build信息:
INSERT INTO builds (build_number) VALUES ('Build_123'), ('Build_234');
  1. 插入Build_123的测试结果:
INSERT INTO test_results (test_id, build_id, executed, passed)
VALUES (1, 1, 'Y', 'Y'), (2, 1, 'N', 'N');

这样整个数据结构清晰规范,完全解决了原设计的痛点。

内容的提问来源于stack exchange,提问作者naqushab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:25