美文网首页
sql学习笔记4-三大范式

sql学习笔记4-三大范式

作者: 风一样的我1 | 来源:发表于2020-10-10 22:39 被阅读0次

    1、第一范式(1NF)

    第一范式即表的字段必须原子性,不可以再分割。如果实体中的某个属性具有多个值时,必须拆分为多个属性。如在统计某商品的进销存信息时,不能将“销售”作为一个字段,因为销售包括了数量和金额甚至其它信息。
    当然,表格字段设计得越详细,在做某些实际操作时会越方便,但也并不绝对。总之,范式应根据不同的业务场景而设计。

    2、第二范式(2NF)

    在满足1NF的前提下,除主键以外的任意一列,都完全依赖于主键(而不能是部分依赖)。

    • 完全依赖:由一个或者一组联合属性能推出Y,即说Y完全依赖于X;
    • 部分依赖:由一组联合属性的部分能推出Y,即说Y部分依赖于X,一般有联合主键时出现。那么此时不符合2NF的要求。
      举例说明。
    CREATE TABLE order(product_id int, product_name varchar(20),
                       customer_id int,customer_name varchar(20), 
                        PRIMARY KEY(product_id, customer_id));
    

    上表中,product_id和customer_id都部分依赖于联合主键,因此不符合2NF。要满足2NF,需要作拆表的操作。

    CREATE TABLE order(order_id int, product_id int,
                       customer_id int, 
                       PRIMARY KEY(order_int));
    CREATE TABLE  product(product_id int, product_name varchar(20),
                       PRIMARY KEY(product_id));
    CREATE TABLE  customer(customer_id int, customer_name varchar(20),
                       PRIMARY KEY(customer_id));
    

    3、第三范式(3NF)

    在满足2NF的 前提下,除开主键列的其他列之间不能有传递依赖关系。
    如在以下的order表中,order_id为主键,但是customer_name还依赖于customer_id,造成了信息冗余,因此不满足第三范式。

    CREATE TABLE order(order_id int, product_id int,
                       customer_id int,
                       customer_name varchar(20) 
                       PRIMARY KEY(order_int));
    

    更改的方法是将customer_name添加到customer表中。

    总结,1NF告诉我们在设计表时要尽量依据业务的需要进行设计(不能过粗也不能过细),2NF和3NF告诉我们只有主键能且完全决定其它属性。

    相关文章

      网友评论

          本文标题:sql学习笔记4-三大范式

          本文链接:https://www.haomeiwen.com/subject/clewuktx.html