0

项目现在遇到一个多表结构难以维护的问题。具体问题是这样的。 我们的后台会发布项目task, 发布后产生task_id, 例如task_id = 120, 然后,项目会被管理员审核。 审核没问题之后, 就要确认发布项目, 此时, 项目120会分出10张表, 比如task_data_120, task_check_120, ..., 这十张表是用来实现任务的各种功能用的, 都不可或缺。随着task的增加, 分表就越来越多, 比如有10task, 那么就会分出100个表来。如果此时要求task的某张分表比如task_data_xx表要增加一个字段, 那么这task_data相关十张表的字段都要同步增加字段。同理, 如果字段名称要修改, 那么相关表的字段也会同步被修改。如果想实现这样的字段批量维护, 有什么好的建议吗?
我们使用的是PHP Yii2框架, 数据库是mysql5.7

wmwdgq 47
2019-05-13 提问
3 个回答
0

已采纳

每次更新or增加数据库字段,都使用php脚本修改or增加,然后循环每个task表进行修改。
可以参考laravel中的migration 貌似在github中也有yii版本的(具体是否符合你的预期可能需要你亲自看下了)。

0

很明显 你这种表的设计就存在问题了。所以建议重新考虑一下

0

我没有在实际情况中遇到这样的问题,不过我有些想法可以一起讨论下。
1、触发器 一张表的字段被修改了,触发器触发修改其他表的字段(触发器调用存储过程,当前看的所有task_XX表都修改)
2、如果不好改业务逻辑,那不能不能这样?加一个拓展字段,里面存的是json数据,每次拓展对象的属性,而不是直接加字段?
3、每次修改执行存储过程,如下面这个,查找出所有表,循环添加字段

DECLARE
 v_sql CLOB;
 v_table user_tables.TABLE_NAME%TYPE;
 CURSOR p_cursor IS SELECT TABLE_NAME FROM USER_TABLES t WHERE t.TABLE_NAME NOT IN('YX_SJCJ_JK','YX_SJCJ_JK_RZ','YX_SJCJ_JK_RZMX'); 
BEGIN
  OPEN p_cursor;
  LOOP 
    FETCH p_cursor INTO v_table;
    EXIT WHEN p_cursor%NOTFOUND;
    v_sql := 'ALTER TABLE '||v_table||' ADD RKRQ DATE';
    EXECUTE IMMEDIATE v_sql;
    v_sql :='comment on column '||v_table||'.RKRQ is ''入库日期''';
     EXECUTE IMMEDIATE v_sql;
  END LOOP;
END;

撰写答案

推广链接