用户挂在部门下面,权限挂在权限模块下面
1.部门表的设计
- 1.首先需要注意的是id的设计,一般都是长整型,无符号 20位的大小,无符号表示id为非负数
- 2.其次需要注意的是可变长度字符串的大小设计,原则是对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。虽然相同的数据他们占用的存储空间,但是字段的最大长度不一致,造成执行计划预估出现较大的偏差,因此给予较高的内存,浪费无所谓的资源。再看一个通过聚合函数操作两张表的例子,会增加CPU的使用。
- 3.能不为空的字段尽量不为空,因为对一列含空值的数据做索引在存储方面会有更多的要求。
- 虽然MySQL可以在含有null的列上使用索引,但不代表null和其他数据在索引中是一样的。不建议列上允许为空。最好限制
not null
,并设置一个默认值,比如0
和''
空字符串等,如果是datetime类型,可以设置成'1970-01-01 00:00:00'
这样的特殊值。对MySQL来说,null
是一个特殊的值,Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values
。比如:不能使用=,<,>
这样的运算符,对null
做算术运算的结果都是null
,count
时不会包括null
行等,null
比空字符串需要更多的存储空间等。
所以最后建表语句为:
2.用户表的设计
CREATE TABLE `sakila`.`Untitled` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户的id',
`user_name` varchar(32) NOT NULL DEFAULT '',
`telephone` varchar(13) NOT NULL DEFAULT '',
`mail` varchar(20) NOT NULL DEFAULT '',
`password` varchar(64) NOT NULL DEFAULT '',
`dept_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '部门id',
`status` int(0) NOT NULL DEFAULT 1 COMMENT '用户的状态,0表示冻结,1表示正常,2表示删除',
`remark` varchar(225) COMMENT '备注',
`operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人',
`operator_time` datetime(0) NOT NULL DEFAULT now(),
`operator_ip` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);
3.权限模块表
CREATE TABLE `sys_acl_module` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限模块的id,无符号表示非负数',
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '权限名称',
`parent_id` bigint(20) NOT NULL COMMENT '上级权限模块的ID',
`level` varchar(255) NOT NULL DEFAULT '' COMMENT '权限模块层级',
`seq` int(11) DEFAULT NULL COMMENT '权限模块在当前层级下的顺序',
`status` int(0) NOT NULL DEFAULT 1 COMMENT '该权限模块是否启用。1启用,0停用',
`remark` varchar(255) DEFAULT '',
`operator` varchar(64) DEFAULT NULL COMMENT '操作人',
`operator_time` datetime DEFAULT NULL,
`operator_ip` varchar(32) DEFAULT NULL COMMENT '最后一次更新操作者的IP',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.权限表
CREATE TABLE `sys_acl` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(255) NOT NULL DEFAULT '' COMMENT '权限码',
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '权限的名称。体现其功能',
`acl_module_id` bigint(20) NOT NULL COMMENT '权限所在权限模块的id',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '请求的url,可以填正则表达式',
`type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '类型。1 菜单 2按钮 3其他',
`status` int(11) NOT NULL DEFAULT '1' COMMENT '该权限是否可以用 1可用,0不可用',
`seq` int(11) NOT NULL COMMENT '权限在当前模块下的顺序,由小到大',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`operator` varchar(64) NOT NULL DEFAULT '',
`operator_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`operator_ip` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5.角色表
CREATE TABLE `sys_role` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色id',
`name` varchar(16) NOT NULL DEFAULT '' COMMENT '角色的名字',
`type` int(11) NOT NULL DEFAULT '1' COMMENT '角色的类型。1 管理员 2其他',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否启用 1 启用 0不启用',
`remark` varchar(255) DEFAULT NULL,
`operator` varchar(64) NOT NULL DEFAULT '',
`operator_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`operator_ip` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6.角色用户关联关系表
CREATE TABLE `sys_role_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`role_id` bigint(20) NOT NULL,
`operator` varchar(64) NOT NULL DEFAULT '',
`operator_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`operator_ip` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7.角色权限关系表
CREATE TABLE `sys_role_acl` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`role_id` bigint(20) NOT NULL,
`acl_id` bigint(20) NOT NULL,
`operator` varchar(64) NOT NULL DEFAULT '',
`operator_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`operator_ip` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
8.权限更新记录表
CREATE TABLE `sys_log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`type` int(11) NOT NULL DEFAULT '0' COMMENT '权限跟新的类型,1部门 2用户 3权限模块 4 权限 5角色\r\n6用户角色关系 7权限角色关系',
`target_id` bigint(20) NOT NULL COMMENT '基于type后指定的对象id',
`old_value` text,
`new_value` text,
`operator` varchar(64) NOT NULL DEFAULT '',
`operator_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`operator_ip` varchar(32) NOT NULL DEFAULT '',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '当前是否复原过 0没有 1有',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9.数据库表设计的规范
第二条解释:如果null字段被索引的话需要额外的一个字节,第二点是如果做索引统计的时候,值得比较将会变得更复杂,这里我们可以使用0还有空字符串或其他代码里没有含义得值占位,给的空字符串就是占位。
在建表的时候我们选择UTF-8,排序规则一般选择utf8_unicode_ci,utf8_general_ci 不区分大小写,utf8_general_ci校对速度快,但准确度稍差。(准确度够用,一般建库选择这个)详见:https://blog.csdn.net/qq_38224812/article/details/80745868