数据库表设计
1、数据类型要合理
1、对于数字和日期类型,一般不要采用varchar类型,这个陷阱很容易被接受
1、容易带来隐式类型转换,导致索引失效,例如 where a=123; a是varchar列,实际存储数字类型值
2、容易带来数据质量的下降,例如日期类型 '2019-01-23'、'2019-23-01',非常不利于将来的分析计算和比较
2、常用数据类型包括varchar、date、number,要注意数据范围,防止数据输入时出现溢出,对表进行ddl会导致海量IO和锁表
2、表上列的选择要适当遵守范式
1、范式要解决的核心问题是数据冗余,数据冗余会带来数据不一致问题,因此对于不能承受数据不一致的一些列数据,不要出现在多个表中
例如用户手机号码
3、表上列的数量要适当,不要出现大宽表,表上列数量过多带来的问题
1、表上列数量多,表上承载的业务类型和业务数量就多,对于系统的并发性会带来很大的问题
订单表:订单信息、支付信息、物流信息、评价信息、签收信息
2、表上列数量多,容易出现大量的空列,对于后期进行数据分析带来很多弊端
3、表上列数量多,一个数据页容纳的数据行会减少,对于后期select操作会带来严重的性能问题
4、频繁访问的主表,尽量不要将大宽列放在表中,例如商品信息表中的商品图片、商品详细描述
采用垂直拆分的方式对大宽列进行拆分
5、适当采用逆范式化来提升表的访问性能,逆范式化就是某些高频访问列出现在多个表中,注意数据一致性的保障
6、数据尽量不要为空、适当采用非空约束not null属性
7、字符集和合理设置,一般建议在数据库层面设置字符集。某些特殊情况可以在表级别和列级别设置字符集
8、约束
1、主键约束:非空、唯一
2、唯一键约束:唯一、可以存在多个空值,注意对空值进行比较的时候,要采用is null、is not null的方式,不能进行null=null之类的比较方式
3、非空约束
4、default约束,日期类型和布尔类型经常会采用default约束
5、外键约束
外键约束会带来性能的降低
外表中插入数据需要访问主表主键索引或者外键索引
主表删除或者修改主键值,需要对外表进行访问或者对应修改,这个需要参考外键级联策略(级联删除、级联修改、级联set null、no action)
尽量减少对外键的使用
外键列上一定要索引,默认会建立索引
9、强烈建议表上要显式建立主键