数据库设计优化需求:存储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表,索引、约束都能统一配置和维护
示例数据插入
对应你原来的示例数据,插入方式如下:
- 插入文件与测试映射:
INSERT INTO file_test_mapping (test_name, filename) VALUES ('1', 'A.txt'), ('2', 'Er.txt');
- 插入Build信息:
INSERT INTO builds (build_number) VALUES ('Build_123'), ('Build_234');
- 插入Build_123的测试结果:
INSERT INTO test_results (test_id, build_id, executed, passed) VALUES (1, 1, 'Y', 'Y'), (2, 1, 'N', 'N');
这样整个数据结构清晰规范,完全解决了原设计的痛点。
内容的提问来源于stack exchange,提问作者naqushab
相关产品推荐
相关产品推荐

