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

2022-08-28 14:08:33 浏览数 (1)

举例:多用户的收藏功能

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

已有数据库表: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昵称),哈哈 学习永无止境。

0 人点赞