数据库设计三范式和反范式

数据库范式 范式的级别 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余(反三范式,一般某个数据经常被访问时,比如数据表里存放了语文数学英语成绩,但是如果在某个时间经常要得到它的总分,每次都要进行计算会降低性能,可以加上总分这个冗余字段)。 后面的范式是在满足前面范式的基础上,比如满足第二范式的一定满足第一范式。 第一范式(1NF):确保每一列的原子性 如果每一列都是不可再分的最小数据单元,则满足第一范式。 但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。 第二范式:非键字段必须依赖于键字段 如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。例如: 第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖) 例如:上面的表,学号和姓名存在传递依赖,因为(学号,姓名)->成绩,学号->成绩,姓名->成绩。所以学号和姓名有一个冗余了,只需要保留一个。 范式的优点: 1)范式化的数据库更新起来更加快; 2)范式化之后,只有很少的重复数据,只需要修改更少的数据; 3)范式化的表更小,可以在内存中执行; 4)很少的冗余数据,在查询的时候需要更少的distinct或者group by语句。 范式的缺点: 范式化的表,在查询的时候经常需要很多join关联,增加让查询的代价 反范式的优点: 1)可以避免关联,因为所有的数据几乎都可以在一张表上显示; 2)可以设计有效的索引; 反范式的缺点: 表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失。 所以在设计数据库时,要注意混用范式化和反范式化。

阅读书单

1 并发编程相关 《Java多线程编程核心技术》 《Java并发编程从入门到精通》 《Java并发编程的艺术》 《Java 并发编程实战》 《深入理解 Java 内存模型》 《实战Java高并发程序设计》 2 MYSQL相关 《Mysql-5.7官方文档》 《高性能MySQL 第3版》 《数据库索引设计与优化》 《数据库查询优化器的艺术》 《MySQL排错指南》 《MySQL技术内幕:InnoDB存储引擎1~2卷》 3 算法相关 《Java数据结构和算法》 《IT名企算法与数据结构题目最优解》 《从PAXOS到ZOOKEEPER分布式一致性原理与实践》 4 分布式和架构 《分布式Java应用基础与实践》 《大型网站系统与Java中间件实践》 《分布式服务架构:原理、设计与实战》 《可伸缩服务架构:框架与中间件》 《构建高性能web站点》 《大型网站技术架构:核心原理与案例分析》 《亿级流量网站架构核心技术》 5 缓存相关 《redis设计与实现(第二版)》 《深入分布式缓存》 《REDIS开发与运维》 6 JVM虚拟机 《Java虚拟机(第二版)》 《自己动手写Java虚拟机》 7 Java Web 《深入分析Java Web技术内幕》 《Spring源码深度解析》 《SPRING技术内幕》 8 其他

在线工具

cron定时任务表达式 编码格式转换 JVM参数调优 apache镜像 java源码搜索 JSON在线解析 谷歌市场国外软件下载 PYPI Python-Package 正则代码生成 RGB颜色参考 在线格式转换 sitemap自动生成 markdown转公众号文章 加密解密工具

自定义序列化之Externalizable接口

Externalizable简介 Externalizable是一种优先级要高于 Serializable 的序列化机制接口, 这个接口提供了writeExternal()和readExternal()方法用于指定序列化哪些属性。 Externalizable接口与Serializable接口区别 * 1 Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器 * 2 transient关键字对Externalizable无效 代码事例 公共抽象实体类AbstractDO public abstract class AbstractDO implements Externalizable { private static final long serialVersionUID = -1679770357930200297L; private Long id; private Date createTime; private Date updateTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.