V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mortonnex
V2EX  ›  程序员

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

  •  
  •   mortonnex · 2017-07-21 18:39:18 +08:00 · 7397 次点击
    这是一个创建于 2677 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
       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   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:19 · PVG 06:19 · LAX 14:19 · JFK 17:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.