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

表设计时候,如果一块业务需要一张新表来实现,但是很多字段都是存在已有的表内的,是否还要将这些字段加入到这个新表中以方便直接单表查询.

  •  
  •   Renco · 2020-09-16 10:53:53 +08:00 · 1668 次点击
    这是一个创建于 1308 天前的主题,其中的信息可能已经有所发展或是发生改变。

    考虑将已有字段全部加入到新表这种做法主要查询的时候。相关数据可以直接通过单表查询,不需要再做表关联。代码也简单。但是会带来一个问题就算原有表的数据改动,新表存储的字段数据依旧是老的,会造成数据的不一致。但数据改动的情况是极少数的,所以这边的设计是要怎么样比较合理一点。

    9 条回复    2020-09-16 14:22:51 +08:00
    Renco
        1
    Renco  
    OP
       2020-09-16 10:55:39 +08:00
    补充一个这个新表的主要功能是做 流水记录。
    Renco
        2
    Renco  
    OP
       2020-09-16 10:56:02 +08:00
    个人理解上觉得 即便流水表记录的是老数据,整体影响也不大。
    wangritian
        3
    wangritian  
       2020-09-16 11:07:30 +08:00
    我的想法是如果项目初期,需求变动频繁,qps 要求不高,可以 join 求灵活;反之需求稳定,qps 要求高,或新旧表业务关联性不高,就复制字段,需要同步修改的时候让旧表模块广播个消息
    libook
        4
    libook  
       2020-09-16 13:28:21 +08:00
    自己的项目经验来看,数据能放在一个地方就不要复制两份,维护缓存是一个超级烦人的问题,还容易出错。

    新字段为什么不能直接加到旧表里,是维度不一样嘛?

    如果是日志表的话,仅承诺数据是当时记录发生时的数据,业务上都以旧表的数据为准就好了。
    richzhu
        5
    richzhu  
       2020-09-16 13:36:32 +08:00
    同样有这个疑问。。。被困扰好久
    saulshao
        6
    saulshao  
       2020-09-16 14:06:22 +08:00
    设计原则的第一条是简单.所谓的冗余字段是为了特殊的需求而进行的额外设计。
    因此,一般情况下不应该将旧表的字段复制到新表中。
    yalin
        7
    yalin  
       2020-09-16 14:11:03 +08:00
    简单双写?
    TomVista
        8
    TomVista  
       2020-09-16 14:18:38 +08:00
    我有一个经验是:
    关系型数据库一般不重复定义,
    非关系型数据库,有这样的需求就应当重复定义字段
    zlowly
        9
    zlowly  
       2020-09-16 14:22:51 +08:00
    虽然我们尽可能至少按 3NF 以上设计数据库时,但有时候也要兼顾性能来冗余数据,所以并不是绝对的。
    另外还有一点就是有时候表面看上去的冗余也是并不一定是冗余。例如一个流水表,里面有录入人员代码,而人员代码表里有部门代码,那原则上流水表中就不需要有部门代码。但实际上人员是有可能变更部门的,那么这时候在流水表里加部门代码字段,就表示流水发生当时人员所属部门,并不算冗余。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5466 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 156ms · UTC 09:18 · PVG 17:18 · LAX 02:18 · JFK 05:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.