数据库设计的三大范式是什么?

2 个回答

  • 无邪
    鸟随鸾凤飞腾远,人伴贤良品自高。
    ### 数据库的三范式 数据库的三范式是数据库设计中用来规范数据库结构的一系列规则。它们旨在减少数据冗余和提高数据的一致性。三范式是逐级依赖的,第二范式建立在第一范式的基础上,第三范式建立在第一和第二范式的基础上。 #### 第一范式(1NF):列不可再分 **定义**: 第一范式要求数据库表中的每一列都是不可再分的基本数据项,也就是说,表中的每个字段都应该是原子的,不可分割。 **示例**: 如果有一个表存储了用户的信息,包括姓名和地址,那么姓名和地址都应该是不可再分的基本数据项。 ```text | 用户ID | 姓名 | 地址 | |--------|------------|-----------------| | 1 | 张三 | 北京市朝阳区 | | 2 | 李四 | 上海市浦东新区 | ``` 在第一范式中,不能有类似“张三,北京市朝阳区”这样的组合数据。 #### 第二范式(2NF):行可以唯一区分(主键约束) **定义**: 第二范式要求在满足第一范式的基础上,表中的每一行都可以通过一个唯一标识(主键)来区分。也就是说,表必须有一个主键,并且表中的非主属性必须完全依赖于主键。 **示例**: 在用户表中,我们可以通过用户ID来唯一标识每一个用户。 ```text | 用户ID | 姓名 | 地址 | |--------|------------|-----------------| | 1 | 张三 | 北京市朝阳区 | | 2 | 李四 | 上海市浦东新区 | ``` 每一行数据都可以通过用户ID唯一区分,且每个非主属性(姓名、地址)都完全依赖于用户ID。 #### 第三范式(3NF):表的非主属性不能依赖于其他表的非主属性(外键约束) **定义**: 第三范式要求在满足第二范式的基础上,表中的非主属性不能依赖于其他表的非主属性,所有非主属性都必须直接依赖于主键。 **示例**: 考虑一个订单表,包含订单ID、用户ID、订单日期和用户地址。如果用户地址依赖于用户ID而不是订单ID,这种设计就违反了第三范式。应该将用户信息单独存放在一个用户表中,订单表中只存放与订单相关的信息。 ```text 用户表: | 用户ID | 姓名 | 地址 | |--------|------------|-----------------| | 1 | 张三 | 北京市朝阳区 | | 2 | 李四 | 上海市浦东新区 | 订单表: | 订单ID | 用户ID | 订单日期 | |--------|--------|----------| | 101 | 1 | 2023-01-01| | 102 | 2 | 2023-01-02| ``` 在第三范式中,订单表的非主属性(订单日期)只依赖于订单表的主键(订单ID),而用户表的非主属性(姓名、地址)只依赖于用户表的主键(用户ID)。 ### 总结 - **第一范式(1NF)**:确保每列都是不可再分的基本数据项。 - **第二范式(2NF)**:确保每行有唯一标识(主键),每个非主属性完全依赖于主键。 - **第三范式(3NF)**:确保非主属性不依赖于其他非主属性,所有非主属性直接依赖于主键。 遵循这三大范式,可以有效减少数据冗余,提高数据一致性和数据管理的效率。
    发布于 2023-02-19 07:46 •IP属地 辽宁
    举报
    评论
    收藏

  • 小菜鸟
    二八佳人体似酥,腰间仗剑斩凡夫。
    ## **1. 什么是数据库范式(Database Normalization)?** 数据库范式是一种**数据库设计规范**,目的是**减少数据冗余**,提高**数据一致性**,避免**更新异常**。常见的数据库范式有: ### **✅ 第一范式(1NF):属性必须具有原子性** - **要求**:每个字段都必须是不可再分的数据项。 - **示例**: - **不符合 1NF**:`地址 = "北京市朝阳区三里屯某小区"` - **符合 1NF**: ```sql province | city | district | street ---------|--------|---------|-------- 北京市 | 朝阳区 | 三里屯 | 某小区 ``` ✅ **1NF 作用**:保证数据的**基本格式化**,防止数据存储混乱。 ### **✅ 第二范式(2NF):所有非主键字段必须完全依赖主键** - **要求**: - **必须有主键**(唯一标识每条记录)。 - **所有非主键字段必须完全依赖于主键,不能只依赖主键的一部分**。 - **不符合 2NF**: ```sql student_id (主键) | course_id (主键) | student_name | course_name ------------------|----------------|-------------|------------ 1001 | 2001 | 张三 | 数学 1001 | 2002 | 张三 | 语文 ``` - `student_name` 只依赖 `student_id`,而 `course_name` 只依赖 `course_id`,但 `student_id + course_id` 才是主键,因此违反 2NF。 - **符合 2NF**(拆分表): ```sql -- 学生表(student) student_id (主键) | student_name ------------------|------------- 1001 | 张三 -- 课程表(course) course_id (主键) | course_name ----------------|------------- 2001 | 数学 2002 | 语文 -- 选课表(student_course) student_id (主键) | course_id (主键) ------------------|---------------- 1001 | 2001 1001 | 2002 ``` ✅ **2NF 作用**:**消除数据冗余,避免更新异常。** ### **✅ 第三范式(3NF):非主键字段不能依赖于其他非主键字段** - **要求**: - **所有非主键字段** 只能依赖主键,不能依赖其他非主键字段。 - **消除传递依赖**。 - **不符合 3NF**: ```sql employee_id (主键) | employee_name | department_id | department_name -------------------|--------------|--------------|--------------- 101 | 张三 | 10 | 技术部 102 | 李四 | 10 | 技术部 ``` - `department_name` 依赖 `department_id`,而 `department_id` 又依赖 `employee_id`,形成**传递依赖**,不符合 3NF。 - **符合 3NF**(拆分表): ```sql -- 员工表 employee_id (主键) | employee_name | department_id (外键) -------------------|--------------|------------------- 101 | 张三 | 10 102 | 李四 | 10 -- 部门表 department_id (主键) | department_name ------------------|-------------- 10 | 技术部 ``` ✅ **3NF 作用**:**进一步减少数据冗余,提升数据一致性。**
    编辑于 2023-01-05 14:16 •IP属地 美国
    举报
    评论
    收藏