关于如何记录数据更改记录的两种建表方式



title: 关于如何记录数据更改记录的两种建表方式
date: 2018-08-08 22:07:44
tags: 数据库
---

当时要做的一个项目要包含一个权限管理功能,以为该系统中的所有人分配权限。而且这个权限管理的需求是可以把权限接近无限的下发(我感觉现实中是不会无限下发的(。???)ノ),这些都先不讲。因为有权限管理就涉及到用户分组的变动,权限的使用等,但是这些操作都是应该要记录下来的。于是有了两种方案。

1.通过一张单独的事件记录表来记录事件:

id uid eventid etime
  • id是自增
  • uid是指用户的id,就是事件的对象
  • eventid是事件id,有另外一张表列出所有可能的事件,eventid为其id
  • etime:事件的时间
优点:
  1. 这种方法比较直观,比较容易能想到。
  2. 操作也不是很麻烦
缺点:
  1. 同时要操作多张表(比如要将一个人的权限删除,那么在权限表中要将其对应的记录删除,在记录表中要对这个事件进行记录)。
  2. 需要列车所有操作的可能(这好像也不是啥缺点(。^▽^))。

2.通过增加时间字段来记录事件

比如有一张用户-分组的表:

id uid gid
  • id主键自增
  • uid用户id
  • gid权限组id

如果是按照第一种方法,当一个人被分入某个权限组时,则向这张表添加相应记录,还要向记录表添加纪录。但是如果多了两个字段,starttime(起始时间),endtime(结束时间),那么就不一样了。

id starttime endtime uid gid

当一个用户被分配到某分组时,记录这个时间放在starttime中,当一个用户被踢出分组是记录踢出时间放到endtime中。这样的话,只要检测endtime中是否有值就可以判断用户的状态了,这样这表的作用就不仅是记录分组情况了,而且也保留记录了。

优点:
  1. 需要建的表少了。
  2. 当有操作时不需要删除记录,只需记录时间,操作的表也少了。
缺点:
  1. 如果某张表有频繁的操作则很容易造成数据冗余。

原文地址:https://www.cnblogs.com/flytree/p/11622652.html

时间: 2024-10-23 03:29:14

关于如何记录数据更改记录的两种建表方式的相关文章

Form表单中method=post/get两种数据传输的方式的区别

Form提供了两种数据传输的方式—get和post,Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法,感兴趣的朋友可以了解下,或许对你学习get/post有所帮助 Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的. Form中的get和post方法

[转] 两种自定义表单设计方案

无涯 原文 两种自定义表单设计方案 [原创] 2006-12 最近参与一个项目,客户要求提供自定义表单的功能.主要的要求是:能够对表单的字段进行增删改,对显示表单的格式可以灵活定制.由于客户的表单变动可能比较频繁,所以决定实现自定义表单功能.初步设想出以下两种自定义表单的解决方案,目前只涉及到表单的显示方案. 请大家讨论一下两种方案的优劣,使用哪种较好.也欢迎大家提出更好的解决方案. HTML模板方案 概述:采用HTML模板方式.对于每一种样式的表单定义HTML模板:在模板中定义Web页面的HT

CPNtools协议建模-----门卫过滤两种帧存储方式

1.门卫过滤作用 两种帧格式定义方式的过滤 ,第一种方式  数据存储定义格什为 colset frame=product  MAC *MAC*DATA      第二种数据帧存储格式定义为 colset frame=record dst:MAC*addr:MAC*d:DATA; 第一种使用门卫过滤方式 [#1 f=addr]        对应的第二种过滤方式    [ #dst f=ad ] 2.对应于变迁的输出代码片段的的过滤这里不再重复,查阅之前的博客 原文地址:https://www.c

UIImage的两种加载方式

UIImage的两种加载方式 1.有缓存:读取后放入缓存中下次可直接读取,适用于图片较少且频繁使用. [UIImage imageNamed:@"文件名"]: 在缓存中由系统管理,当收到memoryWarning时会释放这些内存资源. 2.无缓存:用完就释放掉,参数传的是全路径,适用于图片较多较大的情况下. NSString *path = [[NSBundlemainBundle] pathForResource: @"1.png"ofType: nil]; [U

android环境下两种md5加密方式

在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md5的认知目前仅仅停留在会使用的水平,想搞清楚还是要花点时间的,这是md5加密算法的相关介绍.本文主要介绍android平台下两种md5加密方式,分别为基于java语言的md5加密及ndk环境下基于c语言的md5加密. 下面代码为基于java语言的md5加密: public String getMD5

Linux驱动的两种加载方式过程分析

一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低.若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间. 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行

python实现快速排序算法(两种不同实现方式)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

Hibernate两种获得sessionFactory方式的区别

Hibernate 可以通过sessionFactory.openSession()和sessionFactory.getCurrentSession()来获得session,下面来浅说一下两者区别. [sessionFactory.openSession()]     通过session工厂sessionFactory.openSession()方法来获得一个session,每次都创建一个新的session出来,并且每次Hibernate都会打开数据库和应用程序的连接. [sessionFac

(总结)Nginx使用的php-fpm的两种进程管理方式及优化

PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache