关于如何记录数据更改记录的两种建表方式
当时要做的一个项目要包含一个权限管理功能,以为该系统中的所有人分配权限。而且这个权限管理的需求是可以把权限接近无限的下发(我感觉现实中是不会无限下发的(。・∀・)ノ),这些都先不讲。因为有权限管理就涉及到用户分组的变动,权限的使用等,但是这些操作都是应该要记录下来的。于是有了两种方案。
1.通过一张单独的事件记录表来记录事件:
id | uid | eventid | etime |
---|---|---|---|
- id是自增
- uid是指用户的id,就是事件的对象
- eventid是事件id,有另外一张表列出所有可能的事件,eventid为其id
- etime:事件的时间
优点:
- 这种方法比较直观,比较容易能想到。
- 操作也不是很麻烦
缺点:
- 同时要操作多张表(比如要将一个人的权限删除,那么在权限表中要将其对应的记录删除,在记录表中要对这个事件进行记录)。
- 需要列车所有操作的可能(这好像也不是啥缺点(。^▽^))。
2.通过增加时间字段来记录事件
比如有一张用户-分组的表:
id | uid | gid |
---|---|---|
- id主键自增
- uid用户id
- gid权限组id
如果是按照第一种方法,当一个人被分入某个权限组时,则向这张表添加相应记录,还要向记录表添加纪录。但是如果多了两个字段,starttime(起始时间),endtime(结束时间),那么就不一样了。
id | starttime | endtime | uid | gid |
---|---|---|---|---|
当一个用户被分配到某分组时,记录这个时间放在starttime中,当一个用户被踢出分组是记录踢出时间放到endtime中。这样的话,只要检测endtime中是否有值就可以判断用户的状态了,这样这表的作用就不仅是记录分组情况了,而且也保留记录了。
优点:
- 需要建的表少了。
- 当有操作时不需要删除记录,只需记录时间,操作的表也少了。
缺点:
- 如果某张表有频繁的操作则很容易造成数据冗余。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用