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

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

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

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

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

    后来 A 又有自己的类型

    B 又有自己的类型

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

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

    26 条回复    2021-11-25 15:31:34 +08:00
    lscho
        1
    lscho  
       2021-11-24 11:39:58 +08:00
    没办法,字段多了就分表
    infun
        2
    infun  
       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
    银行有很多一个表字段六七百。
    ospider
        10
    ospider  
       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 的类型字段就各自维护,主表也能保持简单,后续有新类型就新增类型表就行了
    php01
        24
    php01  
       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   ·   我们的愿景   ·   实用小工具   ·   5174 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:10 · PVG 16:10 · LAX 01:10 · JFK 04:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.