一个前端,爱跑步、爱吉他、爱做饭、爱生活、爱编程、爱南芳姑娘,爱我所爱。世间最温暖又无价的是阳光、空气与爱,愿它们能带你去更远的地方。

  • 文章
  • 心情
  • 照片墙
  • 留言板
  • 工具
  • 友链
  • biaoblog

    专注web开发技术分享

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

    随笔 270 2022-08-26 09:15

    举例:多用户的收藏功能

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

    已有数据库表: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