我在不同的公司都遇到同一个问题,就是如何用统一的用户表来存储不同业务的用户 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Yuicon
V2EX    程序员

我在不同的公司都遇到同一个问题,就是如何用统一的用户表来存储不同业务的用户

  Yuicon
Yuicon 2020-05-26 16:22:16 +08:00 5473 次点击
这是一个创建于 1970 天前的主题,其中的信息可能已经有所发展或是发生改变。

比如一个后台有公司自己的管理员、运维等等 又有商户用户 商户的员工之类的

我在好几家公司看到都是不同身份单独建表 后面写业务痛苦万分 比如登录、权限

我后面想改成用统一的用户表 又有不同身份的用户需要的字段不一样的问题 之前我是不删原来的身份表来当子表存放特殊字段 但是有同步数据的麻烦

现在换了家公司 遇到同样的问题 现在我的方案是统一用户表 增加一个 json 字段来存放身份自定义字段 这样就有搜索问题 准备用 es 这类来解决

不知道大家有没有刚好的方案

39 条回复    2020-05-27 14:00:39 +08:00
Yuicon
    1
Yuicon  
OP
   2020-05-26 16:33:31 +08:00
10 分钟了 大佬们
AngryMagikarp
    3
AngryMagikarp  
   2020-05-26 16:36:13 +08:00
基本用户表中加入一个身份字段,比如 role,然后针对每一种 role 创建一个信息表。

用 JSON 来存不方便查询、更新等操作。
yinzhili
    4
yinzhili  
   2020-05-26 16:36:21 +08:00
主表+扩展表 这样的做法比较常见
sagaxu
    5
sagaxu  
   2020-05-26 16:46:47 +08:00 via Android
不要统一
不要统一
不要统一
Yuicon
    6
Yuicon  
OP
   2020-05-2617:02:53 +08:00
@sagaxu 为啥啊 我感觉统一有很多好处
donnior
    7
donnior  
   2020-05-26 17:05:38 +08:00
keycloak 之类的方案能满足你的需求不?
Yuicon
    8
Yuicon  
OP
   2020-05-26 17:11:04 +08:00
@donnior 功能也不复杂 没必要引入一个黑盒 自己实现更好
fighterlyt
    9
fighterlyt  
   2020-05-26 17:24:13 +08:00
@Yuicon
不要混淆了业务复杂度和技术复杂度,技术人员能够调整或者掌控的只有技术复杂度。不同层次的问题,需要在不同层次上解决。用户的登录问题或者说权限问题,引入专门的策略引擎,就可以解决这个问题了,推荐 OPA.
Yuicon
    10
Yuicon  
OP
   2020-05-26 17:28:52 +08:00
@fighterlyt 我觉得这部分是可以通用的 微服务化后 一个统一的用户表是刚需
fighterlyt
    11
fighterlyt  
   2020-05-26 17:32:44 +08:00
@Yuicon 无论如何,内聚不是体现在表上的,而是服务,数据只是载体,服务才是业务
janwarlen
    12
janwarlen  
   2020-05-26 17:34:50 +08:00
好文
wushigejiajia01
    13
wushigejiajia01  
   2020-05-26 17:39:43 +08:00 via Android
这不就是用 基本信息表 + 扩展信息表
两张表就可以了啊

用户姓名、id 、身份类型之类放基础信息表,各个身份独有信息放扩展表

缺陷就是有多个身份就会存在多个扩展表
chendy
    14
chendy  
   2020-05-26 17:41:20 +08:00
用户基本信息统一,不同业务不同权限在各自的数据里做
xuanbg
    15
xuanbg  
   2020-05-26 17:43:10 +08:00
不同身份仅仅是不同应用的不同角色而已,只要角色表加一个 appId 字段就行了。https://github.com/xuanbg/insight_auth
这个项目的表结构楼主可以参考一下
icerhe
    16
icerhe  
   2020-05-26 17:52:11 +08:00
就你描述的业务而言.运营公司内部的员工(管理,运维等)和外部商户的员工(库管,业务员)就不是一类业务不是一类对象, 本来就不该统一,更不该放在一张表里.
如果你发现不同的用户很难统一很难通用, 那么很可能他们就不能统一不该通用.
退一万步讲, 就算未来有一天你发现两种用户可以统一, 把分离的用户表和业务代码合并所需的重构工作量,也远小于把原来合并的用户表和代码拆开的工作量,

咱们码农要了解业务, 根据业务现实而不是一些死板的"设计原则"来设计系统, 业务现实是第一位的, 应该是设计原则帮助我们更好的实现业务而不是反过来让业务适应设计原则, 那是削足适履
icerhe
    17
icerhe  
   2020-05-26 17:53:54 +08:00
如果权限是全站统一的, 那么权限可以一张表里统一管理, 如果用户本身就不同类,那么就不要强行把用户塞在一起.用户表分离,权限统一管理即可
keepeye
    18
keepeye  
   2020-05-26 17:59:36 +08:00
用户可以统一,但不是把所有业务的用户资料都往一个表里面塞。可以参考下 ucenter
magygt
    19
magygt  
   2020-05-26 18:02:14 +08:00   2
这大概是大厂都在建中台的原因吧。
具体一点,一张表的方案,初期可能是技术友好,实现起来快。多张表的方案,业务友好,边界清晰,初期复杂度高,但后期拓展性更好。
而中台抽象共性,具体解决特性。可以理解成对业务方是一张表。
bsg1992
    20
bsg1992  
   2020-05-26 18:02:51 +08:00
业务不一样 不需要统一
GG668v26Fd55CP5W
    21
GG668v26Fd55CP5W  
   2020-05-26 18:08:18 +08:00 via iPhone
@wushigejiajia01 没错,WordPress 就是这样实现的,一张 user 表,一个 user_meta 表。理论上可以无限扩展,缺点就是经常要关联查询
tuochenlyu
    22
tuochenlyu  
   2020-05-26 21:29:01 +08:00 via iPhone
建议业务不明确或变化快时,能不拆就不拆,通过附属表的一个一段区分业务类型,数据库字段名称用 string1,int1 之类的代替,再用 orm 映射成有意义的名称。这样多个附属表就合并成了一个表。
后面业务量大或者业务稳定明确,再拆分也不迟。
janxin
    23
janxin  
   2020-05-26 21:38:10 +08:00
只有用户身份标识统一,其他的无需统一
zxcslove
    24
zxcslove  
   2020-05-26 21:56:54 +08:00
人员,身份,等级,部门,这些可以认真模仿一下现实世界。
night98
    25
night98  
   2020-05-26 22:08:58 +08:00
是这样的,如果你的业务需求是单个用户账号可能存在多个角色时,那么放在一张表是比较合适的场景,比如一个商户账号既是商户,又是运维。这种情况下就比较适合单表存储,另外开设角色表和角色对应的权限表。
而如果你的业务需求是各个角色涉及的业务操作完全不一样,那么直接开多个表即可,将不同用户账户的服务完全隔离开,比如商户方单独有商户的服务,用户单独用户的服务,运维单独运维的服务,这样既减少了鉴权的请求,同时也更容易理解数据的边界。
saulshao
    26
saulshao  
   2020-05-26 22:14:18 +08:00
建立一个基础的用户表,这个表只存放所有角色都需要用到的字段,例如名字,密码,电子邮件,手机号......
其余的字段按照不同的角色划分,例如供应商表存放发货地址,收款账号,等等。
我之前也一直觉得,扩展性的意思是见了一个表用一辈子,有业务需求的时候不改最佳。
但是这个世界是变化的,扩展性最佳的例子,其实是建立起一个额外的表,然后对应的 CRUD 。
akira
    27
akira  
   2020-05-26 22:30:44 +08:00
维护系统的人 和 使用系统的人,这 2 类账号最好还是分离
jones2000
    28
jones2000  
   2020-05-26 23:31:06 +08:00
用 mongo, 扩展也方便。
jugelizi
    29
jugelizi  
   2020-05-26 23:41:49 +08:00 via iPhone
这是到处挖坑啊
LokiSharp
    30
LokiSharp  
   2020-05-27 00:53:20 +08:00 via Android
单个表大了索引会很慢的
xy90321
    31
xy90321  
   2020-05-27 01:11:48 +08:00
强行统一意义何在
在你觉得都是用户(因为最终是对应具体的物理人???),可是换个角度看根本就不是不同 entity
BadAngel
    32
BadAngel  
   2020-05-27 07:02:31 +08:00 via Android
NoSql 不就行了吗?想怎么来怎么来
594duck
    33
594duck  
   2020-05-27 07:03:50 +08:00
@icerhe 老哥的回答非常好,有理有据。另外这个题主真的差,自己回贴竟然是十分钟了。
fyutou
    34
fyutou  
   2020-05-27 09:32:50 +08:00
一个用户表+一个角色表,可行不
xy2020
    35
xy2020  
   2020-05-27 09:52:39 +08:00 via Android
用户表的设计说简单也简单,说复杂也复杂,具体需要看业务需求:不仅要看现在的需求,还要看未来的需求。例如,如果当前的系统无论如何发展都不会和其它系统关联数据,或者用户在系统中只能有一个手机号、且历史手机号记录永远没有价值等等,这时我们就可以考虑用户用单表、且直接包含所有属性字段。但如果不是,例如系统必然会和其它产品数据连接,如 OA 系统一般都会和 HR 系统、财务系统、CRM 系统等等系统连接,或者用户可以有多个手机号记录,例如做业务回溯时必须对应办理业务时的手机号、或者是个充值系统等等,这时就必须用主表+属性表的形式。
至于到底要不要做用户表合并,也是同样的思路:看业务需求,包括当前的和未来的。
Yuicon
    36
Yuicon  
OP
   2020-05-27 10:06:51 +08:00
@594duck 你有问题吧 我顶个贴有什么关系 不然早沉下去了 而且虽然回复很多但是并没有我满意的答案 我的方案也是通用用户表加角色子表 只不过现在我想通过 json 类型把子表直接放在通用表里面 这样避免 crud 用户数据涉及到多个表
Yuicon
    37
Yuicon  
OP
   2020-05-27 10:12:14 +08:00
@LokiSharp 我巴不得用户表大到索引很慢的程度 这样我工资就起飞了
wushigejiajia01
    38
wushigejiajia01  
   2020-05-27 13:34:43 +08:00
@Yuicon 用 json 存有隐患的

后期如果有需要做搜索或者筛选条件用到了 你说的“子表”信息字段,那就完蛋

不要相信产品说的“以后不会用这些信息做查询筛选的”,

我以前经历过,真的很痛苦
Yuicon
    39
Yuicon  
OP
   2020-05-27 14:00:39 +08:00
@wushigejiajia01 这我调查过的 本来准备用 es 或者阿里云的 opensearch 解决 后来发现 mysql 本身就支持 可以正常查询的 而且效率还可以 我创建了 10w 条 查 json 里的某个字段 也只要 100ms 左右(辣鸡测试数据库)
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2613 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 30ms UTC 11:58 PVG 19:58 LAX 04:58 JFK 07:58
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