mysql 范式

范式:对表结构的要求!

第一范式(1NF,normal format):字段不能再分。这是字段的原子性。例如:字段“学期时间”:2014-9-1,2015-1-15。 这个字段“学期时间”可以再分为“学期开始时间”,2014-9-1;和“学期结束时间”,2015-1-15。

第二范式(2NF):范式是递增的,要满足第二范式,必须满足第一范式!2NF要求字段对主键没有部分依赖!

先说部分,有部分说明主键是复合主键。来个彻底的解决办法就是,让主键不是复合主键,即让主键是一个字段!

再说依赖,依赖是通过一个字段能确定另一字段,我们就说被确定的字段对确定它的字段有依赖。比如:知道了“名字”字段,便能确定“性别”字段。我们就说“性别”字段对“名字”字段有依赖。 

最后连起来解释部分依赖,记录中某些字段的值只是被复合主键中的某个值确定了,我们就说字段对主键有部分依赖。

做法:只要给表一个“id”字段,并设置自动增长,便可。其实就是取消掉复合主键。通过另一个单一字段的主键来代替。一句话,没有复合主键,就没有部分依赖。
写法为:id int unsigned primary key auto_inrement


第三范式(3NF):满足第二范式,并取消传递依赖。要满足第三范式,不能在一张表上操作了,需要把原表拆分成几个表。当然如果不用拆分了,说明已经满足了。

A->B->C C依赖于B,B依赖于A。这就是传递依赖。

做法:每个实体建立一个表,为每个表建立一个主键id。


总结: 应该说,一条记录里面任何两个数据之间都不能有依赖,除了和主键。主键和任何一个数据之间都存在依赖


文章转载自:http://blog.sina.com.cn/s/blog_9d7221820102v8lw.html

### MySQL 数据库设计中的范式概念及应用 #### 什么是数据库范式? 数据库的设计范式是指在关系型数据库中,数据表设计应遵循的一些基本原则和规则。这些原则定义了一张数据表的设计结构需要达到的标准级别[^1]。 #### 范式的分类及其作用 数据库范式通常分为多个层次,常见的有第一范式(1NF)、第二范式(2NF)、第三范式(3NF),以及更高级别的BC范式、第四范式(4NF)等。每一级范式都建立在其前一级的基础上,并进一步减少冗余性和提高一致性。 - **第一范式 (1NF)** 表格中的每一个单元格必须是一个不可分割的原子值。这意味着表格中的列不允许再嵌套子列表或其他复杂的数据结构。 - **第二范式 (2NF)** 在满足第一范式的基础上,消除非主属性对候选键的部分函数依赖。即确保所有的非主属性完全依赖于整个主键,而不是部分依赖于某个组成主键的一部分[^2]。 - **第三范式 (3NF)** 在满足第二范式的基础上,消除传递依赖。也就是说,如果 A → B 并且 B 不是 A 的超集,则 B 应该被移除到另一个表中。 - **BC范式 (BCNF)** BC范式是在第三范式基础上的一个更强约束条件。它要求对于任何非平凡的函数依赖 X → Y,X 都应该是超级键。即使不存在传递依赖的情况下,也可能违反此规范[^3]。 #### 多值依赖与更高范式 当涉及到多值依赖时,可能会遇到更高的范式需求。例如,在某些情况下,尽管一个表可能已经达到了 BC 范式的要求,但由于存在多值依赖而导致更新异常等问题。此时可以通过分解表来解决这些问题,从而实现第四范式甚至第五范式的设计目标。 #### 实际案例分析 考虑这样一个场景:我们需要记录课程、教师和教材之间的关联关系。最初我们可以构建一个包含 `课程ID`、`教师ID` 和 `教材ID` 的单一表,并将其设置为联合主键。然而这种设计方案虽然能够满足 BC 范式,但如果未来想要单独更改某门课所使用的书籍而无需指定具体的授课老师,则会面临困难。因此合理的做法是将这个复杂的多值依赖拆分成两个独立的关系表来进行管理。 ```sql -- 创建课程与教材的关系表 CREATE TABLE Course_Books ( Course_Name VARCHAR(100), Book_Name VARCHAR(100), PRIMARY KEY(Course_Name, Book_Name) ); -- 创建课程与教师的关系表 CREATE TABLE Course_Teachers ( Course_Name VARCHAR(100), Teacher_Name VARCHAR(100), PRIMARY KEY(Course_Name, Teacher_Name) ); ``` 上述 SQL 片段展示了如何通过分离原本紧密耦合的信息来优化数据库结构,使得后续操作更加灵活高效。 --- ### § 1. 如何判断一张数据表是否符合特定级别的范式?有哪些工具可以帮助完成这项工作? 2. 当我们在实际项目开发过程中发现现有数据库不符合较高水平的范式时,应该采取哪些措施对其进行重构? 3. 如果考虑到性能因素,在什么情况下可以适当放宽对严格范式的要求? 4. 对于初学者来说,学习并掌握不同范式之间差异的最佳方法是什么? 5. 使用 MySQL 中 varchar 类型存储字符串长度的具体含义是什么? 它是如何随着版本变化而改变的呢?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值