← 返回看板

📐 系统一:数据库表设计质量分析报告

评估对象:Schema / DDL 设计质量(元数据层面) | 独立于数据值质量
📅 评估时间:2026-06-23 📊 数据来源:医院会员 / 数据云服务 / 智链云(共3个Excel) 🔍 评估范围:61张表 | 307个字段明细
61
评估表总数
58
D级(设计缺陷严重)
47.3
平均综合得分
3
P0 严重问题

🏷️ 综合等级分布

A 0
B 0
C 3
D 58
A级 ≥90分:0张 B级 75~89分:0张 C级 60~74分:3张 D级 <60分:58张

核心问题:61张表中仅有6张有完整的字段明细文档,剩余55张处于"盲检"状态。 这55张表因为缺少字段元数据,主键设计、约束设计、类型规范等维度均无法评估,默认得低分。 这不是说这些表一定设计得差,而是我们无法证明它们设计得好

🎯 六维度得分明细

评估维度权重平均得分评级得分分布核心问题
主键设计30%49.8D
3张表完全无主键;55张缺字段明细无法确认
约束设计20%40.6D
有字段明细的6张表仅4%字段NOT NULL,零DEFAULT值
类型规范15%47.1D
24个布尔字段用smallint/integer;6个日期字段用varchar
命名规范15%52.6D
整体snake_case良好,但7个字段使用模糊通用词
关联设计10%40.5D
外键字段有但缺乏索引标记和引用约束
冗余度10%53.4D
同名后缀字段跨表重复(_id/_name/_status等)

🔴 P0 严重问题(必须立即修复)

🔴 bp_articleproject — 无主键定义
项目-资讯关系表,存储项目和资讯的多对多映射。没有主键意味着:①同一组(project_id, article_id)可以重复插入;②任何JOIN操作都可能产生笛卡尔积;③数据膨胀后去重不可逆。
建议:立即添加复合主键 PRIMARY KEY (project_id, article_id)
🔴 md_drugbidsourcehc_zb — 无主键定义
全国药品招投标数据主表,是整个招投标数据体系的核心表。无主键意味着中标的药品可能被重复记录,影响所有基于此表的下游分析和API输出。
建议:根据业务规则定义主键,候选:(药品编码, 中标日期, 省份)
🔴 dt_drugbidsourcehc — 无主键定义
药品中标结果明细表。与主表md_drugbidsourcehc_zb关联,自身也无主键。父子两表均无唯一标识,数据完整性的底线失守。
建议:先定义主键后可考虑外键约束 FOREIGN KEY (zb_id) REFERENCES md_drugbidsourcehc_zb(id)

🟠 P1 高优先级问题

🟠 55张表缺少字段明细文档
这55张表分布在"医院会员"和"数据云服务"两个数据库中。除了表名和中文描述外,没有任何字段级的元数据(字段名、类型、约束、说明)。 这意味着对90%的数据资产,我们连"每个表有哪些字段"都不知道。质量评估无法开展,问题发现依赖人工经验。
建议:分三批补齐——第一批:核心业务表(如会员主表、订单表等)→ 第二批:配置/字典表 → 第三批:日志/归档表。
🟠 外键字段无索引标记/无引用约束
有字段明细的6张表中,34个字段名以 _id 结尾(如 articleid, projectid, channelid),它们大概率是外键关联字段。 但元数据中没有任何INDEX标记或FOREIGN KEY约束。百万级数据下,未索引的外键JOIN可能慢10-100倍。
建议:对所有 _id 结尾且非主键的字段,检查实际查询模式,按需创建索引。

🟡 P2 中优先级问题(典型示例)

🟡 类型错配:24个布尔字段用了 integer/smallint/varchar
iscompletion(integer), isslide(smallint), ishover(varchar) 等字段在语义上就是布尔值(是/否),但定义为数值或字符串类型。 问题:①integer类型的iscompletion可以存入3、-1等非法值;②varchar类型的ishover可以存入'yes'/'no'/'1'/'0'等各种变体。
建议:新建表统一用 BOOLEAN;存量表加CHECK约束 CHECK (iscompletion IN (0,1))
🟡 类型错配:6个日期字段存为 varchar
htmlsavetime 的字段定义为 character varying(500),但语义显然是日期时间。 用字符串存日期:①无法用日期函数做范围查询;②格式不统一(有人写 '2026-06-23',有人写 '2026/06/23')。
建议:评估是否有历史数据格式不统一的情况,若有则先清洗再改类型。
🟡 长度溢出:14个字段长度 ≥2048
例如 productname 定义为 character varying(4000)、summary 定义为 character varying(4000)。 varchar(4000) 在 PostgreSQL 中接近 text 类型的上限但又不完全是——它占用固定开销,且索引受限。
建议:评估实际值长度分布,若大部分值 <255 则缩小;若确实需要长文本则改用 TEXT
🟡 命名模糊:7个字段使用通用词
字段名 status(出现在3张表)、type(2张表)、id(没有表级前缀)——这些词在单表内没问题,但在跨表Join时完全无法从名称判断含义。 a.status = b.status 到底在比什么?需要翻文档甚至看数据才能理解。
建议:在字段注释/中文名中明确含义;新字段命名遵循"表名缩写_含义"模式。
🟡 可空率过高:96%字段允许NULL
307个字段中仅12个(4%)定义了NOT NULL约束。这意味着几乎所有字段都可能出现空值——这不是"灵活",而是"没有业务兜底"。
建议:逐字段评估:业务上"不能为空"的字段加NOT NULL;不能加NOT NULL的字段(如可选备注)加DEFAULT值。

🗺️ 改进路径建议

第一阶段
(1-2周)
止血:修复3张无主键表
① bp_articleproject 加复合主键 → ② md_drugbidsourcehc_zb 确认业务唯一键 → ③ dt_drugbidsourcehc 同上。
这3张表设计好主键后,立即在"系统二(值质量评估)"中跑一遍唯一性检查,确认实际数据没有重复。
第二阶段
(2-4周)
补文档:补齐55张表的字段明细
先从DBA/开发获取DDL(CREATE TABLE语句),批量提取字段名、类型、约束。
无法获取DDL的表,用 INFORMATION_SCHEMA.COLUMNS 从数据库直接导出。
补完后重新跑一次系统一评分,预计平均分能从47.3提升到65+。
第三阶段
(1-2个月)
做优化:类型修正 + 索引补全 + 命名规范
① 布尔字段改boolean → ② 日期字段改date → ③ 长varchar评估是否改text → ④ 外键字段按需建索引 → ⑤ 新表遵循统一的命名规范文档。

📌 本报告与系统二的关系

本报告评估的是"表建得好不好"(Schema设计质量)。

系统二评估的是"数据填得对不对"(数据值质量),需要连库跑SQL才能启用。

因果关系:3张表无主键(系统一P0问题)→ 这些表的值质量"唯一性"维度必然差(系统二)。先修设计(系统一),再洗数据(系统二),这是正确的治理顺序。

数据来源:医院会员-sqlserver.xlsx / 数据云服务-sqlserver.xlsx / 智链云-pgsql.xlsx | 分析工具:系统一_表设计质量评估.xlsx | 生成时间:2026-06-23