很好奇飞书的数据库表是咋设计的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lllei
V2EX    数据库

很好奇飞书的数据库表是咋设计的

  •  
  •   lllei 2024-06-28 14:56:57 +08:00 5729 次点击
    这是一个创建于 536 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说我有一个用户管理系统,但随着业务增长,可能需要给用户增加字段。比如说增加:工位,工号啥的。

    那如果我是把用户相关信息存到用户表上,那是要改表吗?

    像飞书这种,一个用户存储的相关信息也很多:手机号,邮箱,工位,工号,分组号,自定义属性……

    这些繁杂的属性是怎么存储的呢?

    22 条回复    2024-06-30 16:45:25 +08:00
    Froward
        1
    Froward  
       2024-06-28 15:00:27 +08:00
    垂直分表
    drymonfidelia
        2
    drymonfidelia  
       2024-06-28 15:02:16 +08:00 via iPhone
    mongodb 可以
    inshua
        3
    inshua  
       2024-06-28 15:02:59 +08:00
    pg 多年前就有 jsonb
    justfindu
        4
    justfindu  
       2024-06-28 15:05:41 +08:00
    很久很久以前用过一个 laravel-meta , 1 - n meta ,
    mark2025
        5
    mark2025  
       2024-06-28 15:21:36 +08:00
    简单查询的非关键字段可以丢 pg 的 jsonb 字段中,随时可以更新,并且还可以给任意(子)字段键名添加索引
    justNoBody
        6
    justNoBody  
       2024-06-28 15:21:44 +08:00
    只要不做统计,我觉得 jsonb 就很完美呀
    lllei
        7
    lllei  
    OP
       2024-06-28 15:34:37 +08:00
    咦,原来这么多人支持 jsonb 吗,我原来还以为是小众做法。
    lllei
        8
    lllei  
    OP
       2024-06-28 15:37:26 +08:00
    但我是感觉飞书应该是垂直分表 或 mongodb ?
    nothingistrue
        9
    nothingistrue  
       2024-06-28 15:39:37 +08:00   2
    第一,没人规定不能改数据库,给表加几列,是非常简单的事。
    第二,如果为了性能考虑,不方便给用户表加列,那就把用户表拆成主要信息表,跟次要信息表,只要不参与检索的都扔到次要表,然后次要表加列。
    第三,属性超过三十个,并且还基本都是万年不用一次的属性的时候,那它就没必要用到「列」这种级别的数据了,组装成 JSON 后,作为字符串存到一列里面,部分数据库还可以直接用 JSON 类型( Mysql 不要用,坑太多)。

    还有一种数据结构,纵表,有用,但是很少回去用它,就懒得说了。
    nothingistrue
        10
    nothingistrue  
       2024-06-28 15:44:08 +08:00
    如果你还有检索需求,并且还是随便挑几个属性去检索的需求,那么这时候就必须 mongodb 或者其他对象数据库了,JSON 都顶不住,关系数据库的纵表方案,想都不要想。
    sujin190
        11
    sujin190  
       2024-06-28 16:27:53 +08:00   1
    用户表这种作为核心流程的表,基本设计原则应该是核心字段横表且固定不轻易修改,非核心字段纵表 KV 动态扩展,也就是常规用户信息都会分为 user 表和 profile 表,虽然数据库表加字段确实很容易,但是核心表三天两头改字段真的是在给自己加很多班,以及上面什么自定义字段什么存 json 什么 mongodb 动态都很坑,毕竟用户表作为核心流程几乎串联了整个系统,必需稳定且可靠,关于哪些是核心字段哪些是非核心字段就看设计功力了
    sujin190
        12
    sujin190  
       2024-06-28 16:36:29 +08:00
    或者复杂的还可以进一步分成用户表、账户表、档案表和通行证表,你说的工位,工号,分组号这种会动态变化的一般都属于档案信息,基于用户档案信息通用性相关及查询效率优化,用户档案还可能进一步分成基础档案表和扩展档案表,业务逻辑一般都是用用户表来串联的,这个表几乎不可能会修改,也保证了各业务系统可以可靠依赖用户信息,而档案信息其它业务系统需要使用也必需直接从用户系统通过接口实时获取,这样档案数据结构修改就要容易很多了影响也小
    IanLeto
        13
    IanLeto  
       2024-06-28 16:45:12 +08:00
    出海做准备吧,欧洲国家对产品团队女性占比有要求的,尤其产品发布会,电影发布会这种对外宣发类工作。
    IanLeto
        14
    IanLeto  
       2024-06-28 16:48:19 +08:00
    @IanLeto 回错主题了~~
    encro
        15
    encro  
       2024-06-28 17:27:38 +08:00
    user 的 account 表和 profile 表分开来。
    encro
        16
    encro  
       2024-06-28 17:28:16 +08:00
    增加字段现在也可以无锁加了,非常方便。
    lllei
        17
    lllei  
    OP
       2024-06-28 19:20:42 +08:00
    @sujin190 学习了
    lllei
        18
    lllei  
    OP
       2024-06-28 19:21:58 +08:00
    @nothingistrue 学习了
    louisxxx
        19
    louisxxx  
       2024-06-29 03:09:40 +08:00
    最简单的就是垂直分表
    KJR5OR04CnCiWf02
        20
    KJR5OR04CnCiWf02  
       2024-06-29 20:57:04 +08:00
    mongodb 我知道,另一种大家说的垂直分表方案是怎么做的?
    drymonfidelia
        21
    drymonfidelia  
       2024-06-29 21:01:20 +08:00
    @ppppppp123
    建一个表,三个字段
    userid=111
    field=name
    value=abc
    KJR5OR04CnCiWf02
        22
    KJR5OR04CnCiWf02  
       2024-06-30 16:45:25 +08:00
    垂直分表方案 是从哪里流行来的?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3028 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 12:46 PVG 20:46 LAX 04:46 JFK 07:46
    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