关系型数据库中常用的表设计

1.字典表(sys_dict)

作用:用于存放多组值不变的基础数据,只对系统提供查询功能.

*记录的新增、更新、删除都是通过手动进行操作.

*其中dict_code为dict_title的编码,相同dict_title的记录为同一组基础数据,每组基础数据下又有多对dict_value与dict_name.

*每组基础数据可以根据实际的业务需求在程序中创建对应的枚举类(value和name属性).

2.系统配置表(sys_config)

作用:用于存放系统的配置项,某些业务逻辑需要根据配置项的值来做出相应的处理.

*记录的新增、删除都是通过手动进行操作.

*在系统配置页面中查询配置项并修改配置项的值.

*在某些业务逻辑中需根据模块ID和配置代码查询配置项,根据不同的配置值做出相应的处理.

*可以创建一个枚举类存放模块ID,创建常量类存放config_code.

3.地域表(sys_area)

作用:用于存放省市区地域数据,一般只对系统提供查询功能.

*记录的新增、更新、删除都是通过手动进行操作.

*在页面中通过多级联动选择地域,调用根据父编码查询记录的API(首次查询父编码为0的记录表示顶层节点)

4.RBAC

用户表(sys_user)

角色表(sys_role)

菜单表(sys_menu)

*若使用Shiro安全管理框架,则在实现Realm的doGetAuthorizationInfo()方法中,通过用户的Principal查询用户拥有的Role以及Permission各存放到Set集合中返回给SecurityManager,在Controller中通过注解或XML配置的方式设置资源必须拥有指定的role或permission时才能访问.

*登录接口校验成功后需要返回用户的个人信息以及拥有的角色给前端进行页面元素的控制.

用户角色关联表(sys_user_role)

*其中user_id和role_id为联合主键,可以保证一个用户不会存在相同的角色.

*当在页面查看用户拥有的角色时,调用后台API通过用户ID查询用户拥有的角色以及系统所有的角色,后台进行双重遍历,当用户拥有目标角色时flag设置为ture,供前端checkbox渲染.

*当在页面为用户新增或移除角色时,调用后台API传递选中的角色实体,后台可以删除用户拥有的所有角色再进行批量入库或者相对当前用户判断新增和删除了哪些角色再进行分步SQL操作.

角色菜单关联表(sys_role_menu)

*其中role_id和menu_id为联合主键,可以保证一个角色不会存在相同的权限.

*当在页面查看角色拥有的权限时,调用后台API通过角色ID查询角色拥有的权限以及系统所有的权限,后台进行双重遍历,当角色拥有目标权限时flag设置为ture,供前端checkbox渲染.

*当在页面为角色新增或移除权限时,调用后台API传递选中的权限实体,后台可以删除角色拥有的所有权限再进行批量入库或者相对当前角色判断新增和删除了哪些权限再进行分步SQL操作.

5.机构表(sys_office)

作用:用于存放公司的组织架构关系(适用于集团)

*新增记录时前端需要传递新增的机构信息以及父机构ID,后台将会根据父ID查询机构实体,获取其所有的父ID,构造本次新增机构实体的所有父ID,最终进行入库操作.

*删除记录时前端需要传递要删除的机构ID,后台将删除本机构及其所有子机构,只要所有的父ID中包含要删除的机构ID则也应被删除.

6.系统操作日志(sys_log)

作用:用于记录用户在系统中的操作行为.

*系统操作日志功能一般会进行日志的输出以及数据的入库.

*系统操作日志表由于数据量众多,因此需要在查询参数中添加索引.

*利用拦截器的afterCompletion方法实现系统操作日志(在请求被响应之后调用)

1.通过afterCompletion方法的handler参数获取访问控制层对应方法的Method对象,通过反射获取标注在控制层方法的@RequirePermissions注解中的value属性,再通过此属性从菜单表中获取对应的操作名称.

2.通过afterCompletion方法的HttpServletRequest参数的getRemoteAddress()方法获取客户端远程IP、getHeader()方法获取HTTP请求头中的user-agent参数、getRequestURI()方法获取请求URL、getParameterMap()方法获取请求体中的参数、getMethod()方法获取HTTP请求方法.

3.通过判断afterCompletion方法的Exception参数是否为空来确定此处请求是否成功,若Exception参数不为空则获取异常中的信息保存进库中.

*afterCompletion方法中应使用异步的方式新建一个线程进行日志的记录.

*使用拦截器实现系统操作日志功能的好处是可以通过HttpServletReqeust实体获取更多关于客户端的信息,缺点是不易扩展,只能通过键值对的形式获取请求参数.

*利用Spring AOP的环绕通知实现系统操作日志.

1.切入点为Service层中的业务方法.

2.当Service层中的方法执行前将会进入切面中的环绕通知方法,可以通过ProceedingJoinPoint的getArgs()方法获取连接点的参数集,在此时可以根据记录ID查询数据库中变更前的记录实体.

3.执行ProceedingJoinPoint的process()方法调用连接点,方法的返回值为连接点的返回值,若执行成功且无异常则可以判断变更前和变更后哪些属性发生了变化,最后进行入库操作.

*可以直接在连接点的前后简单的把入参和返回值进行打印.

*使用AOP实现日志的好处是不影响原有的代码结构、可以很容易的得到方法执行的参数和返回值、易扩展,可以配置不同的切入点来做不同的逻辑处理,缺点是不能获取更多关于客户端的信息.

原文地址:https://www.cnblogs.com/funyoung/p/9634501.html

时间: 2024-10-25 16:24:41

关系型数据库中常用的表设计的相关文章

非关系型数据库中的「关系」实现

Knowledge Dependence:阅读文本前,你需要了解基本的关系型数据库与非关系型(NoSQL)数据库的概念和区别,以及 MongoDB(Mongoose)的简单实践. ? 这两三年来,伴随着大数据(Big Data)的空前火热,无论是在工程界还是科研界,非关系型数据库(NoSQL)都已经成为了一个热门话题. 相比于传统的关系型数据库,非关系型数据库天生从理念上就给数据存储提供了一种新的思路.而在实际应用中,它往往更轻巧灵活.扩展性高,并且更能胜任高性能.大数据量的场景. 值得一提的是

数据库中常用的删除命令

一.删除用户命令 drop user 和drop user cascade的区别: 1. Oracle中删除用户命令有两种:drop user XX: 和 drop user XX cascade: drop user XX ;必须是在该用户下没有任何对象才能使用该命令,否则会报错:如果用户下有对象,就得用drop user XX cascade ;来删除这个用户以及这个用户下的所有对象. 注:删除用户下的所有对象包括触发器.存储过程.表等,但不会删除表空间. 数据库中常用的删除命令,布布扣,b

Hive中的Order by与关系型数据库中的order by语句的异同点

在Hive中,ORDER BY语句是对查询结果集进行整体的排序,最终将会产生一个reducer进行全局的排序,达到的最终结果是和传统的关系型数据库是一样的. 在数据量非常大的时候,全局排序的单个reducer将会成为性能瓶颈,有可能由于数据量过大而跑不出来结果. Hive中可以设置hive.mapred.mode为strict严格模式,这时候,Hive要求用户必须对order by语句加上limit 条数限制,防止排序数据集过大导致性能瓶颈. 在这里我不提sort by ,distribute

如何将一个数据库中的一个表复制到另一个数据库中的表中

如何将一个数据库中的一个表复制到另一个数据库中的表中 2013-09-11 17:13匿名 | 浏览 13763 次 如何将一个数据库中的一个表复制到另一个数据库中的表中两个表的列名不同.有知道的么?SQL语句直接导过去.! 2013-09-12 20:26网友采纳 热心网友 如果另一个库中没有同名的表select * into b数据库.dbo.a表 from a数据库.dbo.a表 where 条件 如果是追加到另一个表中inert into b数据库.dbo.a表select * from

sqlserver删除数据库中所有的表

sqlserver删除数据库中所有的表 ------------------------------------------------------------------------------------------- 打开Sql server management studio并新建一个查询,在打开的XXX.SQL文件中输入: exec sp_MSforeachtable @command1='Delete from ?' exec sp_MSforeachtable @command1

mysql5.7基础 查看一个数据库中的所有表

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称

1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 3.查询表结构信息: 1 SELECT (case when a.colorder=1 then d.name else null end) 表名, 2 a.colorder 字段序号,a.name 字段名, 3

C#获取Access数据库中的所有表名和列名

//C#获取Access数据库中的所有表名和列名    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=E:\report20100819\report20100819.mdb";    OleDbConnection Conn = new OleDbConnection(ConnectionString);    Conn.Open(); DataTable

SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数

用户表:select count(*) 总表数 from sysobjects where xtype='u' 刚才那个是用户表,下面这个是系统表加用户表: select count(*) 总表数 from sysobject s where xtype in('u','s') 总视图数:select count(*) 总视图数 from sysobjects where xtype='v' 总存储过程数:select count(*) 总存储过程数 from sysobjects where