• 如何设计一个高效可用的数据库


    数据库的设计不合理会导致一张数据表的重复数据很多,系统虽然能够运行,承载能力却很差,稍微有点流量,就会出现内存不足、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 个表就都满足第三范式的要求了。

    总结

    第一范式:数据表中所有字段都是不可拆分的基本数据项

    第二范式:在满足第一范式的基础上,数据表中所有非主键字段,必须完全依赖全部主键字段,不能存在部分依赖主键字段的字段。

    第三范式:在满足第二范式的基础上,数据表中不能存在可以被其他非主键字段派生出来的字段,或者说,不能存在依赖于非主键字段的字段。

  • 相关阅读:
    Revit中管道连接问题和“一键管线连接”
    【C/PTA——7.数组1】
    DateUtils 和 CalendarUtil 类来执行日期处理操作使用说明书
    Prometheus安装部署和Exporter集成
    CSS:盒子模型、border、padding、margin、外边距合并、塌陷现象
    基于SSM的疫苗预约接种平台
    LeetCode刷题(8)
    BSA-maltose 牛血清白蛋白修饰麦芽糖 BSA-麦芽糖
    中断:ZYNQ
    Upload-labs靶场
  • 原文地址:https://blog.csdn.net/woshihaizeiwang/article/details/134079452