前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于多用户数据库表的设计

关于多用户数据库表的设计

作者头像
biaoblog.cn 个人博客
发布2022-08-28 14:08:33
1.2K0
发布2022-08-28 14:08:33
举报

举例:多用户的收藏功能

场景:两个用户共同收藏了一个数据

已有数据库表:dataList, users, collect

1.最开始的构思:

根据用户的唯一id 去创建collect

即collect的主键id为用户的唯一id

collect的另外一个字段为collectData:Array

每次用户执行的收藏和取消收藏操作

都通过用户的Id去更新这个collect的collectData实现

虽然实现了我们的需求,但是有一个问题:

如果想实现分页查询怎么办?

每次用户查询对应的collect的时候,就把指定的collect查了出来,

但是如何去对这个collect的collectData进行 分页操作?

这个是很困难且不正常的需求

2.第二种想法:

在原始数据的表dataList中新增一个绑定跟用户关系的字段

即:bindUsersId

就是每次某个用户(张三)在对dataList中的某一条数据(A)进行 收藏或取消收藏的操作时

对去更新这个A的bindUsersId:Array中新增(收藏)或者移除(取消收藏)张三的id

每次查询收藏的数据时,都需要从dataList中 根据bindUsersId:Array 进行条件查询

这种也能实现我们的需求

但是细想一下:如果有1000个用户同时收藏了一条数据,那么这个bindUsersId:Array 需要绑定1000个ID??

这是非常不正常的

而且还有一种场景

如果拥有收藏数据(A)的某一个用户(张三),对这个收藏的数据A进行了编辑

也就是去编辑了dataList表中的A,那么其它收藏A的用户N ,某一天一看自己收藏的数据被动了

那也是一种非常气愤的....

综合以上加上跟一些大佬的交流

产生了第三种想法:

3.最终的想法(最优)

我们延续第一种想法的同时,

做一些优化,

首先:我们取消以用户为id作为collect的主键

因为这样会导致每个用户只能收藏一条数据,

因为主键是唯一,

优化的做法是:把收藏的数据进行存储,主键自动生成

外键即添加一个跟users关联的数据bindUsersId 就可以了,

举个例子:两个用户(张三,李四)同时收藏了一个数据(A)

那么我们的collect表中 会生成两个收藏的数据(张三A, 李四A)

这两个收藏的数据是独立,唯一的关系型字段就是bindUsersId

这个bindUsersId即表示了它属于谁(张三,李四),

这样就解决了第一种想法 分页没办法做的问题

以及第二种想法:1个数据的多个用户的归属问题...

大家一人一个糖果,而不是大家共享一个糖果,

然后 我们的需求和问题就得到完美的解决了!

感谢提供思路的大佬J (qq昵称),哈哈 学习永无止境。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.最开始的构思:
  • 2.第二种想法:
  • 3.最终的想法(最优)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档