zoukankan      html  css  js  c++  java
  • 【mysql-02-3】使用文档-范式

    一、数据表设计-第一范式1NF 

    第一范式(1NF):数据表中的所有字段都是不可分割的原子值。

    只要字段值还可以继续拆分,就不满足第一范式。

    范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定。

    1、举例1student2数据表) 

    create table student2(

    id int primary key,

    name varchar(20),

    address varchar(30)

    );

       

    insert into student2 values(1, '张三', '中国河南省001号');

    insert into student2 values(2, '张三', '中国河南省002号');

    insert into student2 values(3, '张三', '中国河南省003号');

    字段值可以继续拆分的数据表,不满足 第一范式!

    2、举例2student2数据表==拆字段==student3数据表) 

    create table student3(

    id int primary key,

    name varchar(20),

    country varchar(30),

    province varchar(30),

    city varchar(30),

    details varchar(30)

    );

       

    insert into student3 values(1, '阿星', '中国', '河南省', '商丘市', '梁园区钻石总统府1号');

    insert into student3 values(2, '阿星', '中国', '河南省', '商丘市', '梁园区黄金总统府2号');

    insert into student3 values(3, '阿星', '中国', '河南省', '商丘市', '梁园区蓝钻总统府3号');

    address =====》 country | province | city | details

    二、数据表设计-第二范式2NF 

    第二范式(2NF):必须是在满足第一范式的前提下。第二范式要求:除主键外的每一列都必须完全依赖于主键。

    如果要出现不完全依赖,只可能发生在联合主键的情况下。

    第二范式(2NF):1NF + 除主键外的每一列都要完全依赖于主键。

    1、订单表(联合主键=>共同组成订单表的主键) 

    -- 订单表

    create table myorder(

    product_id int,

    customer_id int,

    product_name varchar(20),

    customer_name varchar(20),

    primary key(product_id, customer_id) /*共同组成订单表的主键*/

    );

    2、订单表问题(不满足2NF 

    product_id 只和 product_name 有关;

    customer_id 只和 customer_name 有关。

    出现了 联合主键,可能会出现一些列 只依赖于 主键的某一部分。

    除主键以外的其它列,只依赖于主键的部分字段。

    拆表:拆分 为 主表 和 副表

    3、拆表 

    拆分成三个表之后,就满足了第二范式的设计! !

    -- 订单表

    create table myorder(

    order_id int primary key,

    product_id int, /*完全依赖于主键*/

    customer_id int /*完全依赖于主键*/

    );

    -- 产品表

    create table product(

    id int primary key,

    name varchar(20) /*完全依赖于主键*/

    );

    -- 客户表

    create table customer(

    id int primary key,

    name varchar(20) /*完全依赖于主键*/

    );

    三、数据表设计-第三范式3NF 

    第三范式(3NF):必须是在满足第二范式的前提下。第三范式要求:除开主键列的其它列之间,不能有传递依赖关系。

    第三范式(3NF):2NF + 除开主键列的其它列之间,不能有传递依赖关系。

    • customer_id int, /*customer_phone与order_id有关系*/
    • customer_phone varchar(15) /*customer_phone与order_id、customer_id有关系 ===》关系冗余! */

       

    create table myorder(

    order_id int primary key,

    product_id int,

    customer_id int, /*customer_phone与order_id有关系*/

    customer_phone varchar(15) /*customer_phone与order_id、customer_id有关系 ===》关系冗余!*/

    );

    -- ======应该这样写!====== --

    CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
    );

    CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    phone VARCHAR(15)
    );

       

    修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

    参考文献 

    https://github.com/hjzCy/sql_node/blob/master/mysql/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.md

    https://blog.csdn.net/weixin_44949135/article/details/106694730

  • 相关阅读:
    每日一题-mysql(持续更新)
    http面试问题集锦
    存储测试简析
    横向越权测试—安全漏洞
    性能数据的准备-Jmeter
    获取当天七天时间
    vue生命周期
    vue的全选与反选
    filter兼容问题
    Http与Https
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/14352517.html
Copyright © 2011-2022 走看看