商品信息表的反范式化设计:mysql
商品信息:{商品名称,分类名称,出版社名称,图书的价格,图书描述,做者}sql
分类信息:{分类名称,分类描述}数据库
在线销售表的反范式化设计:数据库设计
订单表:{订单编号,下单用户名,手机号,下单日期,支付金额,物流单号,订单金额}函数
订单商品的关联表:{订单编号,订单商品分类,订单商品名,商品数量,商品单价}性能
反范式化后的查询每一个用户的订单的总金额的SQL语句:优化
select 下单用户名,sum(订单金额) from 订单表 group by 下单用户名;spa
反范式化后的查询下单用户和订单详情的SQL语句:设计
select a.订单编号,a.用户名,a.手机号,b.商品名称,b.商品的单价,b.商品数量 from 订单表 a join 订单商品的关联表 b on a.订单编号=b.订单编号; ###范式化的优缺点code
为表中的字段选择合适的数据类型(当一个列能够选择多种数据类型时,应该优先考虑数字类型,其次是日期类型或者二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型)
整数类型:
tinyint(1个字节)、smallint(2个字节)、
mediumint(3个字节)、int(4个字节)、bigint(8个字节)
复制代码
实数类型:
float(4个字节,不为精确类型)、double(8个字节,不为精确类型)、
decimal(每4个字节存9个数字,小数点占一个字节,为精确类型)
复制代码
varchar和char类型:
varchar类型存储特色:
用于存储变长字符串,只占用必要的存储空间;
列的最大长度小于255时则只占用一个额外字节用于记录字符串长度;
列的最大长度大于255则,要占用两个额外字节用于记录字符串长度
如何对varchar列选择合适的宽度:
使用最小的符合需求的长度;
varchar(5)和varchar(200)存储MySQL字符串性能不一样
varchar的适用场景:
字符串列的最大长度比平均长度大不少;
字符串列不多被更新的字符串的列;
使用了多字符集存储字符串
char类型存储特色:
char类型是定长的;
字符串存储在char类型的列中会删除末尾的空格;
char类型存储的最大的宽度是255
char类型的适用的场景:
适合存储所长度近似的值(eg:md5的值、手机号、身份证号)
适合存储长度短小的字符串
适合存储存储常常更新的字符串
复制代码
日期类型:
datatime类型以YYYY-MM-DD HH:MM:SS[.fraction]格式存储数据
datatime类型与时区无关,占用8个字节存储空间
存储的时间范围:1000-01-01 00:00:00到9999-12-31 23:59:59
timestamp类型存储从1970年1月1日到当前的秒数,以YYYY-MM-DD HH:MM:SS[.fraction]显示,占用4个字节存储空间
timestamp类型显示依赖于所指定的时区
timestamp类型在行数据修改时能够自动修改timestamp列的值
timestamp存储的时间范围1970-01-01到2038-01-19
date类型和time类型(mysql5.7以后加入):
date类型占用的字节数比使用字符串、datatime、int存储要少,使用date类型只须要3个字节;
date类型使用Date类型还能够利用日期时间函数进行日期之间的计算;
date类型存储的日期范围1000-01-01到9999-12-31之间的日期
time类型用于存储时间数据:HH:MM:SS
存储日期时间类型的注意事项:
不要使用字符串类型来存储日期时间数据;
日期时间类型一般比字符串类型所占用的存储空间小;
日期时间类型在进行查找过滤时能够利用日期来进行对比;
日期时间类型有丰富的处理函数,能够方便的对时间类型的进行日期计算
使用Int存储日期时间不如使用Timestamp类型
复制代码
InnoDB如何选择主键: 主键应该尽量的小; 主键应该是顺序增加的(以减小随机IO),增长数据的插入效率; InnoDB的主键和业务主键能够不一样
创建数据库结构
维护优化数据库