数据库的设计不合理会导致一张数据表的重复数据很多,系统虽然能够运行,承载能力却很差,稍微有点流量,就会出现内存不足、CUP 使用率飙升的情况,甚至会导致整个项目失败。因此要想设计好数据库,就需要了解数据库设计的三大范式
所有的字段都是基本数据字段,不可进一步拆分。
在上面这个表中,“property”这一字段可以继续拆分。其他字段已经都是基本数据字段,不能再拆了。经过优化,我们把“property”这一字段,拆分成“specification(规格)”和“unit(单位)”
第二范式要求,在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的。而且所有字段,都必须完全依赖主键,不能只依赖主键的一部分
根据这个要求,我们可以对表进行重新设计。
重新设计的第一步,就是要确定这个表的主键。通过观察发现,字段“listnumber”+“barcode”可以唯一标识每一条记录,可以作为主键。确定好了主键以后,我们判断一下,哪些字段完全依赖主键,哪些字段只依赖于主键的一部分。同时,把只依赖于主键一部分的字段拆分出去,形成新的数据表。
首先,进货单明细表里面的“goodsname”“specification”“unit”这些信息是商品的属性,只依赖于“barcode”,不完全依赖主键,可以拆分出去。我们把这 3 个字段加上它们所依赖的字段“barcode”,拆分形成一个新的数据表“商品信息表”。
这样一来,原来的数据表就被拆分成了两个表
同样道理,字段“supplierid”“suppliername”“stock”只依赖于“listnumber”,不完全依赖于主键,所以,我们可以把“supplierid”“suppliername”“stock”这 3个字段拆出去,再加上它们依赖的字段“listnumber”,就形成了一个新的表“进货单头表”。剩下的字段,会组成新的表,我们叫它“进货单明细表”。
这样一来,原来的数据表就拆分成了 3 个表
如果你仔细看的话,会发现,我们的进货单头表,还有数据冗余的可能。因为“suppliername”依赖“supplierid”。那么,这个时候,就可以按照第三范式的原则进行拆分了。
第三范式要求数据表在满足第二范式的基础上,不能包含那些可以由非主键字段派生出来的字段,或者说,不能存在依赖于非主键字段的字段。在刚刚的进货单头表中,字段“suppliername”依赖于非主键字段“supplierid”。因此,这个表不满足第三范式的要求。
那接下来,我们就进一步拆分下进货单头表,把它拆解成供货商表和进货单头表。
这样一来,供货商表和进货单头表中的所有字段,都完全依赖于主键,不存在任何一个字段依赖于非主键字段的情况了。所以,这 2 个表就都满足第三范式的要求了。
第一范式:数据表中所有字段都是不可拆分的基本数据项
第二范式:在满足第一范式的基础上,数据表中所有非主键字段,必须完全依赖全部主键字段,不能存在部分依赖主键字段的字段。
第三范式:在满足第二范式的基础上,数据表中不能存在可以被其他非主键字段派生出来的字段,或者说,不能存在依赖于非主键字段的字段。