用户中台的用户模型应该怎样设计

先从场景开始

场景:你们公司有两个业务线,对外有两个App,分别是 A 和 B,小明在两个App上都注册了,他的用户数据应该怎样存储?

如果两个业务线有各自的用户系统
业务会各自存储自己的用户数据,就是App A有张用户表,App B有张用户表,两个App的数据是完全独立的。

如果是用户中台统一存储用户数据的话,一般也是两条数据,可能是存在一张表里,通过app区分,例如

app, 手机号, 昵称, 密码
A, xx, xx, xx
B, xx, xx, xx

如果是也可能是按照业务分表的做法,app A 的数据存在user_a,app B的数据存在user_b中。

这些方案都是很容易就想到的。

我们公司的业务线是没有独立的用户系统的,都是依托用户中台的,假设是你,
现在你们老板提了个需求,需要把这多个业务线的用户数据打通(不需要用户参与,用户注册时数据自动关联)。可能你脑子里已经有方案了,但接下来我要和你介绍我们的方案,这也是我司用户中台迭代的三个版本。

第一个版本

关键词:依托答辩

数据库使用的是mongo,上面例子的数据是这么存的

{"id": "xxx","name": "xx","phone": "xxx","app": ["a","b"],"password": "xxx"
}

通过手机号码关联不同业务之间的数据,app表示用户注册过的app。
从这条数据不难联想到以下几个问题:
1。如果用户在App a 上把手机号换了,其他已经注册的app岂不是也换了,用原本的账号登录不了了?!

是的,这也是导致很多用户反馈过的问题。后来我们把换号的逻辑改了,换号时,如果app不仅仅包含当前的app,那就不修改原数据,改为根据新号码创建或修改数据

2。密码都用了一个,也会出现一个app换密码,其他app密码都换了的情况,怎么办呢?

增加了app独立的密码字段app_a_password,登录时,如果有这个字段,会用这个密码校验

3。用户注销怎么办

直接从app列表里,把注销的app删掉

4。如果App A的用户和App B的用户属性不一致怎么办

效仿密码的处理,于是用户数据里多了一些这样的字段app_a_nickname,app_a_delete_time,app_b_status

于是用户数据就成了

{"_class": "java.util.HashMap","_id": "xxx","phone": "xx","account": "xx","app_b_id": "xx","alias_id": ["vBglqAqd6Sf","349954228"],"app_a_pdate":NumberLong(1573818941),"app_a_shop_code": "03064794","app_a_status":NumberInt(1),"app_a_title": "李s卫","app_a_type": "1","app_a_type2": "7","app_a_id": "vBglqAsxq6Sf","date_create":ISODate("2019-11-15T11:55:41.000Z"),"id": "vBglqAq6Sf","iid":NumberInt(349954228),"personal_shop_code": "03093255","regip": "180.152.24.41","app_a_avatar": "","weixin": "13262709697","identity": NumberInt(0),"app": ["a","b"]
}

除了数据库存储的事一坨之外,对外接口,代码逻辑也是一坨。。。

大佬总结

用户信息、员工信息、账号信息、状态、店铺code、个人钱包code 全部都糅杂在一条数据上。 这就算了,主要是多个不同业务域的
用户信息、员工信息、账号信息、状态、店铺code、个人钱包code 也全部都糅杂在一条数据上。

简单四个字:

罄竹难书

测试看了会流泪,用户看了会沉默:
1 因为原用户系统奇葩的调用拓扑
2 因为原用户系统诡异的代码实现
3 因为原用户系统面目全非的范接口的存在
4 因为原用户系统秉承着最底层业务所以无业务逻辑,但是却在Dao层写满了互相干扰的业务逻辑的神操作

后人互勉

要想练就绝世武功,就要忍受常人难忍受的痛

第二个版本

第一个已经是依托答辩了,第二个版本也是在第一托上稍微优化了下

底层数据库不适用mongo了,通过数据迁移、双写等方案,逐步将mongo上的数据迁移到了mysql中,并且按业务做了数据分离。
上面的例子,数据分别存在了 user_app_a 和 user_app_b 中。
如何解决老板的需求,把多个业务的用户数据打通呢?引入了一个uid和一张用户基础表 user_base。
user_base中存储了用户基本信息,并为每个用户生成了一个唯一的uid。
业务用户表user_app_a写入时,会查询用户基础表,得到uid,user_app_a表中的用户数据会通过uid关联到user_base。

这么设计好像没啥问题哈,但是有些业务表没有存用户手机号码,而是用用户基础表中的手机号,所以还是存在上面那个换手机号码的问题。

接口和代码逻辑里,用户对象全都是map。。。

大佬忍不住了

现实模型:
1、一个人,常规情况下,99.9999999% 他是有只一个身份证号码的。
2、一个人,常规情况下,他可以凭着自己的意愿去营业厅买电话号码的。
或一张电信sim卡,或两张sim联通卡,或三张电信sim卡(实名认证之后一个人最多拥有5张卡)。
3、一个人,常规情况下,他可以凭着自己的意愿去营业厅注销他自己的sim卡的。
或一张,或两张,或全部(只要他没欠费,没有涉嫌刑事备注)。
4、一个人,常规情况下,他是可以在自己的APP里面换电话号码的,或一年一次、或半年一次、或每天都可以、或只要手速够快每秒钟都可以。

所以一个常规的正常的用户系统 为什么 换电话号码会是个问题呢?

所以为什么我们要去讨论这个问题呢?

第三个版本

在这个版本,我们终于可以正常的更换手机号码了!!!

在第二个版本的基础上,不再通过uid和用户基础表强关联了。

不再使用map了。不同的业务允许有不同的用户模型,有不同的接口,不同的逻辑。
真的是天下大势,分久必合,合久必分。。。

用户模型应该怎么设计呢

这个问题我还没有很好的答案
一个物理人在一个应用域下可以有多个用户(未实名认证)。

一个用户在一家企业(店铺/集团)下有一个员工,但是一个用户可以在多家企业(店铺/集团)下都有任职,从而一个用户是可以有多个不同企业的员工身份。

一个员工为了使用 其它服务能力,必须拥有账号做为操作的载体,从而一个员工在所属的店铺/集团下可以有多个账号,实现不同的职能划分。

用户和员工、账号的性质区分
用户:属于个人
员工、账号:属于企业组织
在组织的层面上,强烈要求只允许修改 员工,账号的信息,用户信息的操作不以组织的意志为转移,组织对用户只能有读的能力。
在属性设计时要明确哪些是企业的信息和要用到的信息,要维护到员工、账号中去,哪些是个人信息,可以维护到用户中。从模型概念上说,用户只属于个人,所以他可以任职且被多个组织可见,如果其中一个组织修改了用户的信息,会影响到其他的组织对用户的使用。

用户的唯一性
用户中有唯一判别其他用户的业务属性,如手机号、邮箱等等。没有唯一性的用户会不可控,破坏业务的发展。

账号的使用必须依赖于存在的用户
一个可执行的账号,是依赖员工、店铺存在的,而员工是依赖用户存在的。
必须要有所属用户,账号才可以进行业务操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES5到ES6 js的语法更新

js是一门弱语言类型,为了实现更有逻辑的代码,需要不断更新语法规范,es就是用来规范js语法的标准。 09年发布了es5,到15年发布es6,到现在es6泛指es5.1以后的版本es2016,es2017。 var、let、const 关键字&…

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统,为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL,以及如何进行基本的配置,以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …

【C++】OJ习题(初阶)

🚀个人主页:奋斗的小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 💥1、字符串💥1.1 字符串相加💥1.2 验证回文字符串💥1.3 反转…

电商平台的推荐算法需要备案吗?

答案是肯定的! 政策要求: 根据我国《互联网信息服务算法推荐管理规定》(以下简称《规定》)第六条,具有舆论属性或社会动员能力的互联网信息服务,包括电商平台的推荐算法,需要进行备案。 电商平…

ubuntu24.04安装nginx1.24

ubuntu安装nginx 更新包索引 sudo apt update安装nginx sudo apt install nginx确认安装成功并检查Nginx版本 nginx -v启动Nginx服务 sudo systemctl start nginx设置Nginx开机自启 sudo systemctl enable nginx在浏览器中访问 http://<your_server_IP> 来确认Nginx…

Linux学习记录(十二)————共享内存

文章目录 5.共享内存1.概念2.相关函数共享内存映射共享内存进程间的通信 5.共享内存 1.概念 共享内存&#xff08;Shared Memory&#xff09;就是允许多个进程访问同一个内存空间&#xff0c;是在多个进程之间共享和传递数据最 高效的方式。操作系统将不同进程之间共享内存安排…

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…

嵌入式开发就业方向有哪些?前景未来可期!

在科技日新月异的今天&#xff0c;嵌入式系统几乎渗透到了我们生活的各个角落。从简单的家用电器到复杂的工业自动化设备&#xff0c;再到我们手中的智能手机&#xff0c;无一不体现出嵌入式技术的魅力。因此&#xff0c;嵌入式领域的就业前景广阔&#xff0c;为众多求职者提供…

职场难题怎么破?六西格玛培训给你答案!

在当今追求高效与卓越的职场环境中&#xff0c;六西格玛培训如同一股强劲的东风&#xff0c;为众多职场人士带来了提升自我、突破瓶颈的契机。作为起源于摩托罗拉、在通用电气得到广泛应用的管理方法论&#xff0c;六西格玛以其严谨的数据分析、持续的流程优化和卓越的质量提升…

【Kubernetes】k8s集群存储卷(pvc存储卷)

目录 一、PVC存储卷 1.PV 2.PVC 3.StorageClass 4.PV和PVC的生命周期 二、案例 1.创建静态pv 1.1.配置nfs 1.2.创建pv 1.3.创建pvc 1.4.结合pod&#xff0c;将pv、pvc一起运行 2.创建动态pv 2.1.上传 2.2.创建 Service Account&#xff0c;用来管理 NFS Provisio…

一次网络攻击损失170亿元

一次网络攻击能给企业造成多大损失&#xff1f;医疗IT巨头美国联合健康集团给出的答案是——170亿元&#xff01; 今年2月&#xff0c;联合健康集团的子公司、美国最大的商业处方处理商Change Healthcare遭遇网络攻击&#xff0c;导致全美约1/3的医疗机构无法开具处方&#xf…

公认最强充电宝有哪些?盘点四款公认强悍级别充电宝推荐

随着智能手机和其他移动设备的广泛应用&#xff0c;充电宝已经成为我们生活中不可或缺的一部分。然而&#xff0c;市场上众多品牌和型号的充电宝也让消费者面临选择难题&#xff0c;安全隐患也随之浮现。因此&#xff0c;选择一款安全可靠、性能卓越的充电宝显得尤为重要。本文…

[数据集][目标检测]起子检测数据集VOC+YOLO格式1215张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1215 标注数量(xml文件个数)&#xff1a;1215 标注数量(txt文件个数)&#xff1a;1215 标注…

python逻辑控制 学习

if 语句 普通if &#xff0c;与多条件语句 #! /usr/bin/python3 age int(input("请输入你的年龄&#xff1a;")) print("你今年", age, "岁了。") if age < 18:print("你还未成年&#xff0c;请多加努力&#xff01;") elif age …

mysql 彻底重装(删除所有数据)

文章目录 1. 停止 MySQL 服务2. 删除数据库文件a) 先确定数据文件的datadir是在哪里。b) 如果还是没找到&#xff0c;终端中输入命令 3. 重新初始化 MySQL 数据目录4. 启动 MySQL 服务5. 重新设置 root 用户密码 有时候mysql的密码配置错误&#xff0c;连接不上mysql&#xff0…

[802.11e]WMM

WMM概念 WiFi WMM&#xff08;无线多媒体&#xff09;是一种用于无线局域网&#xff08;WLAN&#xff09;的QoS&#xff08;服务质量&#xff09;标准。WMM旨在提供更好的网络性能&#xff0c;特别是在传输多媒体内容&#xff08;如音频和视频&#xff09;时。它通过对不同类型…

PyTorch 基础学习

文章索引&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…

Halcon20.11深度学习目标检测模型

1.前言&#xff1a;.Halcon的深度学习标注工具一直在更新&#xff0c;我下载的20.11版本的Deep Learning Tool已经显示过期&#xff0c;无奈只能下载最新版MVTec Deep Learning Tool 24.05。不过最新版的标注工具做的很人性化&#xff0c;分类&#xff0c;目标检测&#xff0c;…

axios 上传 和下载 excel 文件

axios 上传 和下载 excel 文件 上传 excel 文件 axios 请求配置 import axios from axios// 导入&#xff08;校验数据&#xff09; export const postFile (data) > {return axios.post({url: 上传地址,data,headers: {Content-Type: multipart/form-data}}) }调用方法处 …