一、数据库设计:将数据库中的数据实体以及这些实体之间的关系,进行规划和结构化的过程。
设计过程:
- 需求分析:分析客户的业务和数据处理需求。
- 概要设计:绘制数据库的ER图,确认需求信息的正确性和完整性。
- 详细设计:将ER图转换为多张表,进行逻辑设计,取人哥表的主键外键,并应用数据库设计的三大范式进行审核。最后选择具体的数据库。
二、数据库设计的三大范式:
(1)第一范式
目标:确保每列的原子性。
如果每列都是不可再分的最小数据单元(最小原子单元),则满足第一范式。
(2)第二范式
目标:确保表中每列都和主键相关。
如果一个数据库满足第一范式,并且主键以外的其它列全部依赖于该主键,则满足第二范式。
如果一个主键有多个列,那么其他列必须都对这两个主键列都有依赖。否则可以分开为两个表~
(3)第三范式
目标:确保每列都和主键列相关,而不是间接相关。
如果一个关系满足第二范式,并且除了主键以外的其他列都只能依赖于主键,列和列之间不存在相互依赖关系,则满足第三范式。
第三范式也是对字段冗余性的约束,即任何字段不能由其他字段派生出来,所以要求字段没有冗余。
主键与外键在多表中的重复出现不属于数据冗余,非键字段的重复出现才是数据冗余。
三、范式和连接的代价
表之间的关联是有代价的,当表的数据量比较多的情况下,我们必须在三范式和连接代价之间做一个权衡。
1、表的设计和数据冗余
(1)如果在设计时,已经明确地知道这个系统的数据量不会太大,也就是说表之间关联的代价不会太大,那么用三范式的原则是必需的。毕竟三范式能避免数据冗余带来的更新插入上的“需要同时多表中的相同字段”的麻烦。
(2)如果表的数据量很大,如电商网站,我们可能就需要冗余数据。这时就要尽量避免多表查询,提高查询效率。缺点是要维护冗余数据的一致性。
2、反范式
反范式就是在通过增加冗余数据或数据分组来提高数据库读性能的过程。
数据库的解决方案,应该从业务出发,权衡各种建表代价,挑选一种合适的,而不是死板的。
例如,数据在百万以下,尽可能依据范式设计,最小化冗余或者零冗余。现在机器,在这个量级下处理多表join的能力是OK的。当然合理的索引设计也是必须的。