数据库表结构设计,常见的数据库管理系统( 二 )

二、设计规范1、涉及模块通过上面几个表设计的案例,可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码,存储引擎等 。表设计是一个很大的命题,不过也遵循一个基本规范:三范式 。
2、三范式

  • 基础概念
一范式
表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足 。
【数据库表结构设计,常见的数据库管理系统】二范式
每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现 。
三范式
要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息 。
  • 优缺点对比
范式化设计
范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中 。但是查询起来涉及到关联,代价非常高,非常损耗查询性能 。
反范式化设计
所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高 。
  • 建议结论
上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用 。比如汇总统计,缓存数据,都会基于反范式化的设计 。
三、字段属性合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型 。
1、数据类型选择
  • 整数类型
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可 。
  • 实数类型
FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦 。
  • 字符类型
CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度 。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构 。
  • 时间类型
DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒 。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用 。
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 ;
  • 索引使用
索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引 。这里演示普通索引的操作 。MySQL的核心模块,后续详说 。
添加索引
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 ;
修改索引
不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引 。

推荐阅读