数据库经常新增字段,怎么处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
mortonnex
V2EX    程序员

数据库经常新增字段,怎么处理?

  •  
  •   mortonnex 2017-07-2 18:39:18 +08:00 7863 次点击
    这是一个创建于 3011 天前的主题,其中的信息可能已经有所发展或是发生改变。
    springmvc+mybatis

    表的字段被修改,就有很多之前写的文件需要修改?

    你们的经验是什么?
    33 条回复    2017-07-22 15:59:33 +08:00
    Dx2619
        1
    Dx2619  
       2017-07-21 18:53:54 +08:00 via iPhone
    一定要新增字段吗?新增个表做关联不好嘛?没经验瞎问
    mortonnex
        2
    mortonnex  
    OP
       2017-07-21 18:58:43 +08:00
    @Dx2619 瞎答?
    anyele
        3
    anyele  
       2017-07-21 19:00:38 +08:00 via Android
    同问
    gamexg
        4
    gamexg  
       2017-07-21 19:04:46 +08:00
    可以预先建立备用字段,不过没这样干过。
    Dx2619
        5
    Dx2619  
       2017-07-21 19:41:04 +08:00 via iPhone
    @mortonnex 别误会,我是说我瞎问。
    nandaye
        6
    nandaye  
       2017-07-21 19:41:44 +08:00 via Android
    经常新增应该是模型设计师对业务理解不到位,并且没有合理的预留字段。换个专业的模型或者你的处理逻辑灵活些。
    lzhr
        7
    lzhr  
       2017-07-21 19:47:14 +08:00
    json
    ericls
        8
    ericls  
       2017-07-21 19:51:33 +08:00 via iPhone
    那个表来一个 json column
    fox0001
        9
    fox0001  
       2017-07-21 19:53:27 +08:00 via Android
    你需要 MongoDB
    popbones
        10
    popbones  
       2017-07-21 19:59:34 +08:00 via iPhone
    如果经常新增字段是设计问题考虑更灵活的设计,如果是业务逻辑决定的,考虑 NoSQL
    xuyankang
        11
    xuyankang  
       2017-07-21 20:17:53 +08:00
    mybatis 自动生成 crud,每次改数据库,重新生成一次。
    nutting
        12
    nutting  
       2017-07-21 20:19:37 +08:00 via Android
    说明不需要关系,用 nosql
    mortonnex
        13
    mortonnex  
    OP
       2017-07-21 20:27:02 +08:00
    @xuyankang 那之前手写的 sql 怎么处理?
    nfroot
        14
    nfroot  
       2017-07-21 20:27:14 +08:00 via Android
    这也是我最近考虑的问题 如果是表单类型的页面 想着是不是所有字段都是动态显示的 加的时候设置好 标记好 目标页面直接动态生成
    fortunezhang
        15
    fortunezhang  
       2017-07-21 20:31:13 +08:00
    1.如果有 migration 的话,没有太大问题。 比如 rails laraval 都做的很棒;
    fortunezhang
        16
    fortunezhang  
       2017-07-21 20:36:18 +08:00
    1.如果有 migration 的话(不太了解 java 这一块),没有太大问题。 比如 rails laraval 都做的很棒;
    2.如果没有的话,可以使用一个文件,比如 all_table.sql ,来代替,每次拉下来的时候,看看这个文件有没有变化,变化了,git show 一下执行就好了
    3.设计的时候,如果感觉会新建字段(怎么感觉,这个没法详细解释,比如新闻表,之存了,title,description,content,这时候就能感觉到了),增加一个 data 字段,这个字段存储的内容有特定要求,只负责显示,不参与检索。
    Ouyangan
        17
    Ouyangan  
       2017-07-21 20:44:12 +08:00
    jpa..
    choury
        18
    choury  
       2017-07-21 20:49:22 +08:00 via Android
    修改数据库,实现在线快速加字段功能,哈哈,我们厂是这么做的
    O14
        19
    O14  
       2017-07-21 21:02:18 +08:00 via Android
    用 HBase
    changhe626
        20
    changhe626  
       2017-07-21 21:10:53 +08:00
    谁一定要改数据库表设计,.........
    Miy4mori
        21
    Miy4mori  
       2017-07-21 21:30:50 +08:00 via iPhone
    你可以了解一下 flyway 或者 liquibase
    workwonder
        22
    workwonder  
       2017-07-21 22:32:53 +08:00 via Android
    预留字段真的有意义? 最恶心当初预留的字段瞎起个名字,后来变得“有意义”。
    zhx1991
        23
    zhx1991  
       2017-07-21 22:36:51 +08:00
    新增的字段只有插入的地方要改吧...

    而且只有新的业务要这个字段, 老的逻辑完全不用动啊.
    reus
        24
    reus  
       2017-07-21 22:39:59 +08:00
    手工改掉 SQL 语句,不搞那么多弯弯绕绕
    ebony0319
        25
    ebony0319  
       2017-07-21 22:41:02 +08:00 via Android
    你需要一本书《 sql 反模式》
    rrfeng
        26
    rrfeng  
       2017-07-21 22:43:54 +08:00 via Android
    用 mongo
    leemw
        27
    leemw  
       2017-07-21 23:07:38 +08:00
    mysql 和 mongodb 混用
    wangdu2012
        28
    wangdu2012  
       2017-07-22 08:17:14 +08:00 via iPhone
    修改原表?一看就有点…没经验。
    Livid
        29
    Livid  
    MOD
    PRO
       2017-07-22 10:40:04 +08:00 via Android
    尽量不要 alter table,数据量大的时候锁几个小时都有可能,业务会受很大影响。

    新功能可以用新的表,或者放到一个 key value 数据库里。
    vindurriel
        30
    vindurriel  
       2017-07-22 11:14:21 +08:00
    一个馊主意

    create table object (
    id bigint auto_increment
    )

    create table attr{
    id auto_increment
    object_id bigint
    name varchar(255)
    value varchar(1024)
    key object_attr(object_id,name)
    }

    好处是不需要加字段了,直接 insert attr 即可。
    坏处是不能定义字段取值类型(统一 varchar )

    查询:
    select a.name,a.value from attr a join object o on a.object_id=o.id where o.id=<NUM>
    hahatest
        31
    hahatest  
       2017-07-22 12:48:22 +08:00
    一个成熟方案就是用 migration

    把 migration 的文件存档(i.e.不要加到 .gitignore 里)
    这样要咋加咋加,而且方便 onboarding
    BooksE
        32
    BooksE  
       2017-07-22 13:08:54 +08:00
    这样的话。。。试试 key-value?
    iwillhappy1314
        33
    iwillhappy1314  
       2017-07-22 15:59:33 +08:00
    可以参考一下 WordPress 的 metadata 设计。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:59 PVG 12:59 LAX 21:59 JFK 00:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86