平时开发中,业务膨胀导致表结构臃肿,一般怎么解决,有什么方法论? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kikione
V2EX    程序员

平时开发中,业务膨胀导致表结构臃肿,一般怎么解决,有什么方法论?

  •  
  •   kikione 2021-11-24 11:38:20 +08:00 4048 次点击
    这是一个创建于 1416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说我们业务有自己券体系。

    券分为 A B 两种,在同一张表。

    后来 A 又有自己的类型

    B 又有自己的类型

    如此循环,字段加的越来越多,也越来越耦合。

    请问,建表时,一般要考虑哪些因素,业务越来越耦合时,如何加字段,如何拆表?

    26 条回复    2021-11-25 15:31:34 +08:00
    lscho
        1
    lscho  
       2021-11-24 11:39:58 +08:00
    没办法,字段多了就分表
    GlobalNPC
        2
    GlobalNPC  
       2021-11-24 11:51:36 +08:00
    一百九十多个字段的表都没拆,还在加。。。
    SimonOne
        3
    SimonOne  
       2021-11-24 11:51:55 +08:00   1
    B 加字段
    XX 国企信息管理部评估:表里不就有这个字段了吗?
    答:那时 A 的业务字段,我不能乱用,码值都不一样,只是看着像是一个字段
    XX 国企信息管理部评估:不管,有字段就不能再加,驳回,就用这个字段

    WRNM
    ericgui
        4
    ericgui  
       2021-11-24 11:55:04 +08:00
    业务乱,这又不是技术问题,这个你作为程序员怎么可能解决得了?

    不要幻想代码可以解决一切问题,代码只是现实生活的一个在互联网上的一个映射 /投影,而且你在写代码的时候又要做很多抽象,抽得四不像的情况多的去了

    跑吧
    Samuelcc
        5
    Samuelcc  
       2021-11-24 13:06:04 +08:00
    我在小规模服务中用过 Mongodb 存储多态对象,能够比较优雅地解决这种问题。但是没在大规模服务中尝试过。
    dajj
        6
    dajj  
       2021-11-24 13:10:34 +08:00
    换项目组或者换公司就好了
    eason1874
        7
    eason1874  
       2021-11-24 13:28:07 +08:00
    一步到位是消费主义的谎言.jpg

    后期发展谁说得准呢,不需要过度设计,有一定设计预留就够了

    后期差异太大再分开,重新设计 AB 两张表,迁移或者根据券码、时间决定读新表还是旧表
    clf
        8
    clf  
       2021-11-24 13:34:27 +08:00   3
    (快进到 text 存 json 字符串)
    Ariver
        9
    Ariver  
       2021-11-24 13:36:43 +08:00 via iPhone
    银行有很多一个表字段六七百。
    4BVL25L90W260T9U
        10
    4BVL25L90W260T9U  
       2021-11-24 13:40:07 +08:00
    @clf mysql 5.7 前这也是传统艺能了
    ZhaoWang
        11
    ZhaoWang  
       2021-11-24 13:43:42 +08:00 via iPhone
    垂直拆分成两张,业务自定义垂直表,随便他们折腾
    xuanbg
        12
    xuanbg  
       2021-11-24 13:59:10 +08:00
    @eason1874 设计要有前瞻性,做到能升级、易升级就行了。但不需要预留现在没用的东西,特别是那种从 c0-c99 的预留未定义字段,简直就是辣鸡中的战斗机。
    yunshansimon
        13
    yunshansimon  
       2021-11-24 14:25:28 +08:00
    任何读写都通过一个 dataview 来进行,这个 dataview 用来组织表格,如果有加不了的项,就拆到另一个表中去,用 dataview 来组织这些表,最终呈现一个“统一”的表格给应用,当然,注意要加上一个版本号,以便数据使用方来识别。所有写入都要通过一个写入过程,在过程中来判断要写入那些表中的那些字段,以便分开加锁,这样还能提高性能。
    pengtdyd
        14
    pengtdyd  
       2021-11-24 15:01:12 +08:00
    把该死的架构师拉出去祭天就可以了
    Saxton
        15
    Saxton  
       2021-11-24 18:01:29 +08:00
    考虑自定义字段? 用行来存字段呗,不一定要把字段具体化
    sadfQED2
        16
    sadfQED2  
       2021-11-24 18:50:35 +08:00 via Android
    @clf 基操,勿 6
    zeni123
        17
    zeni123  
       2021-11-24 22:30:28 +08:00 via iPhone
    BigTable 架构啊
    liuxu
        18
    liuxu  
       2021-11-24 22:34:59 +08:00
    解决掉建表的人
    3dwelcome
        19
    3dwelcome  
       2021-11-24 22:52:03 +08:00
    说起来可能楼主不信,但我个人推荐的方式就是对数据套娃。

    也就是对数据库建立一个抽象层的读写 API ,给后端数据库读取的数据,都是加工处理过后的。

    对外看起来是两个表,读写也是两个表。实际存到磁盘上,可能就一个总表了,通过一些代码做逻辑字段的切分。
    akira
        20
    akira  
       2021-11-25 00:43:16 +08:00
    忍受不了的时候 就拆表呀。。
    zachlhb
        21
    zachlhb  
       2021-11-25 08:29:46 +08:00 via iPhone
    分表,先建一个券主表存放通用字段,然后每种券独立到自己的表中,然后根据主表的券类型去各类型表中查扩展数据
    netnr
        22
    netnr  
       2021-11-25 08:58:43 +08:00 via Android
    就举例需求来讲,首先分 1 和 2 ,然后 1 又拆分 11 12 13 ,2 就拆分 21 22 23 ,如果还需要分,那就转成字符串,1-1-1 2-1-1 这种
    也算是一种可扩展的变通,当然涉及到的逻辑也要改,历史数据的维护(很多时候不愿意维护历史数据来支持新的功能,而是通过加字段,反而越来越复杂)
    yogogo
        23
    yogogo  
       2021-11-25 09:30:33 +08:00
    我现在是这样做的,券有一个主表,里面是券的基本信息,id ,编号,名称,类型,假设券类型分 A 和 B ,再建两张类型表 A 和 B ,这样就分开 A 和 B 的类型字段就各自维护,主表也能保持简单,后续有新类型就新增类型表就行了
    anteros
        24
    anteros  
       2021-11-25 09:46:28 +08:00
    不要对重构抱有敌意,拥抱重构,才能前进
    goldpumpkin
        25
    goldpumpkin  
       2021-11-25 10:25:10 +08:00
    @SimonOne 直接换个英文单词 换一个解释, 绕晕它
    bsg1992
        26
    bsg1992  
       2021-11-25 15:31:34 +08:00
    继续加字段
    如果字段是在太多就只能分表
    分表也回带来业务上开发的复杂度
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2836 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 14:04 PVG 22:04 LAX 07:04 JFK 10:04
    Do have faith in what you're doing.
    ubao 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