Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于多用户数据库表的设计

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

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

举例:多用户的收藏功能

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库表设计 基本思路[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。好的数据结构会影响速度。好的数据库表设计会影响数据库操作效率。特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂。 SQL是关系数据库中用到的一种语言。所以,为了简化SQL,表的关系(内部和外部)要尽量设计的合理。 下面有几个可以参照的步骤: 1)找出那个表要描述的东西; 2)列出你想通过这个表得到的相关信息的列表; 3)通过上面的信息列表,将信息划分成一块块小的部分,通过此小块来建表; 比如说: 现在需求是: 1)我需要一个表来管理我的朋友的个人信息; 2)我想要的是:通过名字查到某人的地址,生日和邮箱; 3)将上面的信息划分成一块块分别对应表里的一个字段,所以表可以如下: 姓名
全栈程序员站长
2022/09/06
1K0
淘宝数据库,主键如何设计的?
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显 的错误就是关于MySQL的主键设计。
一个风轻云淡
2022/11/15
1.8K0
淘宝数据库,主键如何设计的?
数据库模型设计——历史与版本设计
在企业数据库设计中,经常会遇到一个需求,就是希望把操作之前的数据保留下来,能够看到操作之前是什么数据,操作之后是什么数据。对于这种需求,我们可以使用保留历史数据或者使用版本来实现。
深蓝studyzy
2022/06/16
1.6K0
数据库模型设计——历史与版本设计
数据库MongoDB-文档操作
在MongoDB中文档是指多个键及其关联的值有序地放置在一起就是文档,其实指的就是数据,也是我们平时操作最多的部分。
cwl_java
2021/02/04
3K0
Mysql实例 数据库优化--数据库表设计
现如今,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显,所以要重视数据库的性能优化。
陈不成i
2021/06/16
2.7K0
淘宝数据库,主键如何设计的?(文末福利)
某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显的错误就是关于MySQL的主键设计。
小熊学Java
2023/07/16
5950
淘宝数据库,主键如何设计的?(文末福利)
数据库有哪些索引
主键索引:主键索引是叶子结点保存主键对应行的全部数据, 在 InnoDB 中,主键索引,也被叫做聚簇索引。二级索引(非主键索引):二级索引的叶子结点保存的是索引值和主键值,当二级索引进行查询时,需要进行回表操作。
王小明_HIT
2021/05/20
2.4K0
MySQL数据库基础:约束
如果已经手动指定了null的话,就按照手动指定的,用户指定的优先级高于默认的优先级
2的n次方
2024/10/15
2370
MySQL数据库基础:约束
MongoDB数据库(一)
在爬虫中我们会时常用到mongoDB数据库。mongoDB的优点在于易扩展,高性能,灵活的数据了类型。
不断折腾
2019/09/23
1.3K0
MySQL:表的设计原则和聚合函数
分类:第一范式(1NF),第二范式(2NF),第三范式(3NF),BC范式(BCNF)
2的n次方
2024/10/15
2990
MySQL:表的设计原则和聚合函数
云数据库基础
本节中的内容来自对uniCloud官方文档的重新梳理,为了让本课程的学习曲线更加平缓,仅保留我认为对本课程有用的部分。
大帅老猿
2022/04/13
2.1K0
云数据库基础
MySQL大表增加唯一索引场景
‍Oracle中字段、索引的使用,相对来讲,还是比较透明的,人为干涉的较少,过程相对标准,可参考历史文章,
bisal
2023/03/19
3.1K0
MySQL单表&约束&事务
需求: 1 查询员工的总数 2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值 3 查询薪水大于4000员工的个数 4 查询部门为’教学部’的所有员工的个数 5 查询部门为’市场部’所有员工的平均薪水
用户5513909
2023/04/25
1.6K0
MySQL单表&约束&事务
数据库 分区表详解
1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是100万条。
全栈程序员站长
2022/09/06
2K0
数据库 分区表详解
数据库技术:MySQL 基础和 SQL 入门,单表、约束和事务
Comparison among different ways of storing data:
RendaZhang
2020/09/08
1.6K0
技术分享 | MySQL 大表添加唯一索引的总结
在数据库的运维工作中经常会遇到业务的改表需求,这可能是DBA比较头疼的需求,其中添加唯一索引可能又是最头疼的需求之一了。
爱可生开源社区
2023/03/13
2.8K0
《ElasticSearch6.x实战教程》之复杂搜索、Java客户端(下)
经过了解简单的API和简单搜索,已经基本上能应付大部分的使用场景。可是非关系型数据库数据的文档数据往往又多又杂,各种各样冗余的字段,组成了一条"记录"。复杂的数据结构,带来的就是复杂的搜索。所以在进入本章节前,我们要构建一个尽可能"复杂"的数据结构。
用户1148394
2019/07/24
9780
彻底搞懂数据库设计的三范式
20.1、第一范式 数据库表中不能出现重复记录,每个字段是原子性的不能再分 不符合第一范式的示例 学生编号 学生姓名 联系方式 1001 张三 zs@gmail.com,1359999999 1002 李四 ls@gmail.com,13699999999
葆宁
2019/04/19
7630
【MySQL】:数据库表的 CRUD 操作
但我就是想让它先确认是不是在数据库中存在,不存在就插入,存在不要拦我然后执行后面的修改语句。
IsLand1314
2025/05/15
1110
基本 SQL 之数据库及表管理
上篇文章,我们基于『数据库』做了一个宏观上的介绍,你应当了解到数据库是在何种背景下,为了解决什么样的问题而诞生的,以及在具体实现下又可以划分哪些中类型。
Single
2019/05/25
2K0
相关推荐
数据库表设计 基本思路[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档