MariaDB表关联问题:如何将桥接表名称替换为电影、人员主键ID
桥接表结构整改与ID映射实现方案
所有操作基于可回滚流程开展,不直接修改原有旧桥接表,避免数据丢失。
第一步:文本格式对齐与异常数据排查
爬虫采集的文本往往存在细微格式差异,直接通过名称匹配会出现大量漏匹配,需先做统一清洗:
- 对桥接表、电影表、人员表中的名称类字段,统一做规范化处理:移除首尾多余空格、统一标点格式(比如人名后缀的
Jr.前是否带逗号、影片名中英文标点统一)、设置不区分大小写的匹配规则 - 可以在表中新增临时的规范化字段作为匹配键,无需修改原始存储的名称值
- 单独导出无法匹配到主表ID的桥接表记录,比如示例中桥接表存储的
Robert Downey, Jr.(带逗号)和人员表存储的Robert Downey Jr.(无逗号)这类差异条目,人工修正匹配关系,确保最终匹配覆盖率达到预期
第二步:搭建规范桥接表
新建符合关联要求的桥接表,结构完全移除冗余的名称字段,直接存储关联主键:
CREATE TABLE movie_person_link ( movie_id INT NOT NULL COMMENT '关联电影表主键', person_id INT NOT NULL COMMENT '关联人员表主键', role VARCHAR(50) NOT NULL COMMENT '关联角色,比如actor、director', -- 加联合唯一键避免重复关联记录 PRIMARY KEY (movie_id, person_id, role), -- 加外键约束保障关联完整性 FOREIGN KEY (movie_id) REFERENCES MOVIES(movie_id), FOREIGN KEY (person_id) REFERENCES PERSON(person_id) );
第三步:完成ID映射与数据迁移
通过关联查询将桥接表的名称值替换为对应主键,写入新的规范表:
INSERT INTO movie_person_link (movie_id, person_id, role) SELECT m.movie_id, p.person_id, old_bridge.role FROM MOVIE-PERSON old_bridge -- 用之前生成的规范化字段做关联,避开原始值格式差异的问题 LEFT JOIN MOVIES m ON m.normalized_name = old_bridge.normalized_movie_name LEFT JOIN PERSON p ON p.normalized_name = old_bridge.normalized_person_name -- 仅导入主表ID匹配成功的有效记录 WHERE m.movie_id IS NOT NULL AND p.person_id IS NOT NULL;
迁移完成后做结果校验:查询对应示例条目,确认movie_id=1(对应影片Avengers)、person_id=22(对应人员Robert Downey Jr.)、角色为actor的关联记录正确写入,和预期效果一致。校验通过后即可将旧桥接表重命名为历史备份表,把新表作为正式的影片-人员关联表使用。
避坑提示
- 不要直接用原始名称值做关联匹配,细微的标点、空格差异就会导致关联失败
- 写入时通过联合主键自动去重,避免爬虫重复采集导致的冗余关联
- 新增的外键约束可以在后续增量爬取数据时,从数据库层面阻断无效的关联记录写入
内容的提问来源于stack exchange,提问作者Steve Roseik
相关产品推荐
相关产品推荐

