举例:多用户的收藏功能
场景:两个用户共同收藏了一个数据
已有数据库表: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昵称),哈哈 学习永无止境。