用戶掛在部門下面,權限掛在權限模塊下面
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