MySQL同库表字段引用另一表实现方法 多按钮对应专属时间表咨询
方案对比与最优实现建议
方案1(外键关联结构化新表)
- 优势:完全符合关系型数据库设计范式,查询灵活度极高,可直接通过SQL完成单条事件的增删改查、跨按钮的事件统计/筛选,数据一致性强,并发操作风险低,你当前只有24个btnobject,就算每个对应10条事件总数据量也只有200+行,完全不存在存储压力。
- 劣势:无明显劣势,唯一需要注意的是外键字段可以进一步优化以提升存储效率。
方案2(存储Python字典字段)
- 优势:表结构简单,单条记录即可存储单个btnobject的全部事件,整体读写时代码逻辑简单。
- 劣势:不符合数据库设计规范,后续无法通过SQL直接操作单条事件,修改单个事件需要读写全量字典数据,并发场景极易出现数据丢失,也不支持事件维度的统计、筛选操作,扩展性极差,除非你100%确定后续永远不需要对事件做单独操作,否则完全不推荐。
更优的优化方案(基于方案1的规范调整)
不需要直接用btnobject字段当外键,复用你现有timetablebtn表的主键sno做关联即可,存储效率更高,主键逻辑更清晰,新表结构建议如下:
CREATE TABLE btn_event_mapping ( event_sno INT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '事件唯一主键', btn_sno INT(5) NOT NULL COMMENT '关联timetablebtn表的sno主键', time VARCHAR(20) NOT NULL COMMENT '事件时间段', events VARCHAR(100) NOT NULL COMMENT '事件内容', FOREIGN KEY (btn_sno) REFERENCES timetablebtn(sno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
查询单个按钮的所有事件直接用关联SQL即可:
SELECT time, events FROM btn_event_mapping WHERE btn_sno = [对应按钮的sno值] ORDER BY event_sno ASC;
内容的提问来源于stack exchange,提问作者Veeraja Veeraesh
相关产品推荐
相关产品推荐

