设为首页 收藏本站
查看: 1606|回复: 0

[经验分享] mysql关系(二维表)的设计规范,范式

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-2 09:54:49 | 显示全部楼层 |阅读模式
范式,NF,normal format,就是指对表的结构的要求!
目的:1,规范结构!2,减少数据冗余!

第一范式,1NF,字段原子性要求字段不能再分,要求字段的原子性
wKioL1ZdHTHzmopCAAB0eAqE2Ko045.jpg
第二范式,2NF,非部分依赖增加唯一主键即可!ID

范式的要求,是逐渐递增!
在满足 了 第一范式的前提下,不能出现部分依赖!
部分依赖指的是:普通字段对 主键 是完全依赖的,而不应该是依赖主键的一部分!
依赖:可以通过那个字段去决定另一个字段

因此,出现主键部分依赖的前提是,出现复合主键!

wKioL1ZdHVTRY799AABD7biX_lo676.jpg
其中代课时间,开始和结束时间,没有部分依赖!称之为完全依赖于主键:

但是,性别,依赖于讲师 字段 即可!
讲师字段是主键的一部分!因此称之为性别 部分依赖于 主键

wKiom1ZdHQuAuEcrAAAyWhAbsE8154.jpg
因此,该表不符合第二范式!

怎么做?
消灭复合主键即可!增加一个唯一字段的主键即可。增加一个与业务逻辑毫无关系的,唯一的ID主键,int unsigned primary key auto_increment

wKiom1ZdHSjgGLtKAABAc_lG_fs933.jpg

第三范式,3NF,非依赖传递在满足第二范式的前提下,取消传递依赖,就是第三范式!

传递依赖:如果字段B对字段A有依赖,而字段C对字段B存在依赖。则出现了传递依赖!
讲师依赖于ID,而性别依赖于讲师。
班级依赖于ID,而教室依赖于班级。

wKiom1ZdHV-SqVFtAAA72AriQDI623.jpg
称之为传递依赖!

解决,要保证所有的字段都完全依赖于主键,而不依赖于其他字段!
将独立的实体信息,使用独立的关系(二维表)进行保存!
分别增加讲师,班级表,将代课信息内的讲师和班级信息拆分出:
wKioL1ZdHeHDZjdKAADYcWuv2UU843.jpg
总结:
每个实体建立一个表,为每个表增加一个主键ID即可!



一个实体表应该如何设计
实体之间的关系的设计多个是体表应该如何设计!

实体之间存在哪些关系?班级,学生两类实体!
一对多,多对一,1:N, N:1

班级,讲师两类实体!
多对多,M:N

学生常用信息,学生不常用信息
一对一,1:1

如何设计?多对一,一对多在多的那端(那个表内),增加一个字段,用于保存于当前记录相关联的一端记录的主键!

wKioL1ZdHhiwcYIZAABTL-Vn5Rs343.jpg

多对多 wKiom1ZdHc6AgnAXAABSzjL5KNI573.jpg
增加一个专门管理关联的表,使 班级与讲师都与关连表存在联系。从而 是两个实体间有多对多的关系!
wKioL1ZdHl7xISKOAACaUM2ywqU055.jpg

因此,一个多对多,会拆分成两个多对一!


一对一 wKiom1ZdHhuTA5M1AACJE94Qa28188.jpg
可见,两个表之间存在相同的主键ID即可!


外键约束约束的作用,是用于保证数据的完整性或者合理性的工具!
外键:foreign key,当前表内,指向其他表的主键的字段,称之为外键!

wKiom1ZdHkHTJX8CAACIpGtCuqI977.jpg
外键约束:用于限制相关联的记录在逻辑上保证合理性的约束称之为外键约束!

约束,不是字段。

建立班级表
wKiom1ZdHmaTTUSoAACHxxIpXHw107.jpg
再创建学生表
wKioL1ZdHvGTxlxXAADBk_w2WAY444.jpg
看看删除班级的情况:
wKiom1ZdHqjx87kcAACVuamJkFs583.jpg

出现了不合理数据:

此时,可以通过增加外键约束 的方式,来限制以上的操作!

增加外键alter table 表名 add constraint 约束的名字 foreignkey 外键索引名字 (外键字段名) references 关联表名 (关联字段) [操作]
wKiom1ZdHsyTeDAMAAAbTuP0yPc056.jpg
再删除个试试:

wKiom1ZdHumAzrEoAABaq1azLj8580.jpg
注意:如果当前的数据,已经不符合所见约束关联,则创建失败!

删除外键alter table table_name drop foreign_key 外键名字!

可以通过 show create table 查看约束的名字:

wKioL1ZdH2vx6nFHAABT2kaaeH8746.jpg
注意,外键约束与索引的关系:

如果需要在某个字段上,增加外键约束,那么需要该字段也同样有索引!如果该字段上,没有索引,此时,mysql会自动在该字段上增加一个普通索引!

wKiom1ZdHySg66I8AAB8Du1sZW4750.jpg
可以选择指定外键约束的名字:
wKioL1ZdH67icT4MAADXxFFASsI409.jpg
注意上面的外键约束自动建立的索引的名字,与外键的名字相同!

总结:在创建时:
1,  外键 与 相应关联表的主键类型
2,  已有数据,必须满足约束条件才可以!
3,  可以使用constraint 关键字,为外键约束起名字!


约束操作在对 父表(被关联的表)做操作时,有三种行为:
1,  严格限制,拒绝操作。restrict
2,  置 null,set null
3,  级联操作,cascade
以上三个行为操作,会在主表记录被 删除或者 更新时被使用!
on delete set null
on update cascade
wKiom1ZdH3aCJlsaAABPggWS3og546.jpg
wKioL1ZdH_GSe_-QAACocec9HYY705.jpg
更新时的级联操作:
只有在关联表的主键发生变化时,才会影响到从表的关联字段的变化!
wKioL1ZdIBXT_AmBAACYQo6GJ4s361.jpg
主表:被关联的
从表:发出关联的!


应该注意的问题:
关于,外键约束,只能在当前的 mysql的的 innodb 表类型(引擎)下才会生效!
wKiom1ZdH9KBZBrzAAAuM9oTMN8427.jpg
外键,站在 php程序的角度,用到的不多!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146201-1-1.html 上篇帖子: 解决mysql数据库不能支持中文的问题 下篇帖子: mysql数据库时间戳与正常时间格式之间的转换 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表