一、数据场景 1、表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据 。数据的存储则需要设计对应的表结构 , 清楚的表结构,有助于快速开发业务,和理解系统 。表结构的设计通常从下面几个方面考虑:业务场景、设计规范、表结构、字段属性、数据管理 。
2、用户场景 例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等 。
- 用户信息表
CREATE TABLE `ms_user_center` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`user_name` varchar(20) NOT NULL COMMENT '用户名',`real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',`pass_word` varchar(32) NOT NULL COMMENT '密码',`phone` varchar(20) NOT NULL COMMENT '手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`head_url` varchar(100) DEFAULT NULL COMMENT '用户头像URL',`card_id` varchar(32) DEFAULT NULL COMMENT '身份证号',`user_sex` int(1) DEFAULT '1' COMMENT '用户性别:0-女,1-男',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
- 单点登录表
CREATE TABLE `ms_user_sso` (`user_id` int(11) NOT NULL COMMENT '用户ID',`sso_id` varchar(32) NOT NULL COMMENT '单点信息编号ID',`sso_code` varchar(32) NOT NULL COMMENT '单点登录码,唯一核心标识',`log_ip` varchar(32) DEFAULT NULL COMMENT '登录IP地址',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户单点登录表';
- 状态管理表
CREATE TABLE `ms_user_status` (`user_id` int(11) NOT NULL COMMENT '用户ID',`account_status` int(1) DEFAULT '1' COMMENT '账户状态:0-冻结,1-未冻结',`real_name_status` int(1) DEFAULT '0' COMMENT '实名认证状态:0-未实名,1-已实名',`pay_pass_status` int(1) DEFAULT '0' COMMENT '支付密码是否设置:0-未设置,1-设置',`wallet_pass_status` int(1) DEFAULT '0' COMMENT '钱包密码是否设置:0-未设置,1-设置',`wallet_status` int(1) DEFAULT '1' COMMENT '钱包是否冻结:0-冻结,1-未冻结',`email_status` int(1) DEFAULT '0' COMMENT '邮箱状态:0-未激活,1-激活',`message_status` int(1) DEFAULT '1' COMMENT '短信提醒开启:0-未开启,1-开启',`letter_status` int(1) DEFAULT '1' COMMENT '站内信提醒开启:0-未开启,1-开启',`emailmsg_status` int(1) DEFAULT '0' COMMENT '邮件提醒开启:0-未开启,1-开启',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户状态表';
- 支付账户表
CREATE TABLE `ms_user_wallet` (`wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '钱包ID',`user_id` int(11) NOT NULL COMMENT '用户ID',`wallet_pwd` varchar(32) DEFAULT NULL COMMENT '钱包密码',`total_account` decimal(20,2) DEFAULT '0.00' COMMENT '账户总额',`usable_money` decimal(20,2) DEFAULT '0.00' COMMENT '可用余额',`freeze_money` decimal(20,2) DEFAULT '0.00' COMMENT '冻结金额',`freeze_time` datetime DEFAULT NULL COMMENT '冻结时间',`thaw_time` datetime DEFAULT NULL COMMENT '解冻时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`wallet_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户钱包';
二、设计规范 1、涉及模块 通过上面几个表设计的案例 , 可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码 , 存储引擎等 。表设计是一个很大的命题,不过也遵循一个基本规范:三范式 。2、三范式
- 基础概念
一范式【数据库表结构设计,常见的数据库管理系统】表的列的具有原子性,不可再分解 , 即列的信息 , 不能分解,关系型数据库MySQL、Oracle等自动的满足 。
二范式每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现 。
三范式要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息 , 没必要在员工表保存相关信息 。
- 优缺点对比
范式化设计范式化结构设计通常更新快 , 因为冗余数据较少,表结构轻巧,也更好的写入内存中 。但是查询起来涉及到关联,代价非常高,非常损耗查询性能 。
反范式化设计所有的数据都在一张表中,避免关联查询 , 索引的有效性更高 , 但是数据的冗余性极高 。
- 建议结论
三、字段属性 合适的字段类型对于高性能来说非常重要 , 基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型 。
1、数据类型选择
- 整数类型
- 实数类型
- 字符类型
- 时间类型
MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型 。
2、基础用法操作
- 数据类型
ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT '0' ;ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT '1' COMMENT '状态:0不可用,1可用';
修改名称位置ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time ;
- 索引使用
添加索引
ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id) ;CREATE INDEX state_index ON ms_user_wallet(state) ;
查看索引
SHOW INDEX FROM ms_user_wallet;
删除索引
DROP INDEX state_index ON ms_user_wallet ;
修改索引不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引 。
- 外键关联
添加外键
ALTER TABLE ms_user_wallet ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id) ;
删除外键
ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key ;
四、表结构管理 1、查看结构 DESC ms_user_status ;SHOW CREATE TABLE ms_user_status ;
2、字段结构 - 添加字段
ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT '删除时间' ;
- 删除字段
ALTER TABLE ms_user_status DROP COLUMN delete_time ;
3、修改表名 ALTER TABLE ms_user_center RENAME ms_user_info ;
4、存储引擎 - 存储引擎
SELECT VERSION() ; SHOW ENGINES ;
MySQL 5.6 支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等 。一般默认使用InnoDB,支持事务管理 。该模块MySQL核心,后续详解 。- 修改引擎
ALTER TABLE ms_user_sso ENGINE = MyISAM ;
5、修改编码 表字符集默认使用utf8,通用,无乱码风险 , 汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用 。- 查看编码
SHOW VARIABLES LIKE 'character%';
- 修改编码
ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4;
五、数据管理 1、增删改查 添加数据
INSERT INTO ms_user_sso ( user_id,sso_id,sso_code,create_time,update_time,login_ip,state)VALUES ('1','SSO7637267','SSO78631273612','2019-12-24 11:56:57','2019-12-24 11:57:01','127.0.0.1','1' );
更新数据
UPDATE ms_user_sso SETuser_id = '1',sso_id = 'SSO20191224',sso_code = 'SSO20191224', create_time = '2019-11-24 11:56:57',update_time = '2019-11-24 11:57:01', login_ip = '127.0.0.1',state = '1'WHERE user_id = '1';
查询数据一般情况下都是禁止使用 select* 操作 。
SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state FROM ms_user_sso WHERE user_id = '1';
删除数据
DELETE FROM ms_user_sso WHERE user_id = '2' ;
不带where条件,就是删除全部数据 。原则上不允许该操作 , 优化篇会详解 。TRUNCATE TABLE也是清空表数据,但是占用的资源相对较少 。2、数据安全
- 不可逆加密
SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba' ;SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d';SELECT PASSWORD('smile')='*B4FB95D86DCFC3F33A3852714DC742C77504479D' ;
- 可逆加密
SELECT DECODE(ENCODE('123456','key_salt'),'key_salt') ;SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123');
上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险 。推荐阅读
- 安卓手机助手哪个比较好用,最好用的手机助手排行
- 远程控制软件哪个好用,免费手机远程控制手机app
- 西安北郊请客吃饭中高档,西安请客吃饭中高档饭店
- 酒店床上一条长条布有什么用,酒店床上的横条布是做什么用的
- gd是什么格式文件,手机打开gd文件方法
- qq群转让为什么有的人不能转 怎么转让群主
- 关于保持内心宁静 远离喧嚣的古诗 愈多愈好
- 三国演义中评价刘备的诗句?
- 关于杨贵妃的诗词都有哪些