数据库与服务器、客户端的层次关系
关于数据库
程序中需要存储数据的方式:
1 变量(列表、元组、集合、字典、嵌套)
2 外存(文件)(*.ini)
3 表格、Excel(*.xls、*.xlsx、*.csv)
4 结构化数据库
数据库中的基本概念
记录(Record):数据库中的一行
字段(Field):数据库中的一列
实体(Entity):现实中客观存在并可以被区分的事物。比如:学生、课程
属性(Attribute):实体锁具有的特征。比如:对于学生实体,所体现的属性有:学号、姓名、年龄、性别
关系(RelationShip):实体与实体之间的依赖。包括:一对一、一对多、多对多。
以上三者(实体、属性、关系)可以组成ER图(实体关系图)
通过Visio的数据库模型图建立表:
建表的时候需要考虑范式的约束
一般有如下范式:1NF 2NF 3NF BCNF 4NF 5NF
1NF:属性不可分
姓名 |
电话号码 |
年龄 |
|
座机 |
手机 |
||
张三 |
020-84444444 |
13777777777 |
23 |
李四 |
020-85555555 |
13888888888 |
34 |
如上,因为电话属性可以拆分为座机和手机,所以不满足1NF,修改如下:
姓名 |
座机 |
手机 |
年龄 |
张三 |
020-84444444 |
13777777777 |
23 |
李四 |
020-85555555 |
13888888888 |
34 |
2NF:符合1NF。非主属性完全依赖于关键字
学号 |
姓名 |
课程编号 |
考试成绩 |
101 |
张三 |
201 |
73 |
102 |
李四 |
202 |
53 |
该表中的依赖关系:
学号——姓名
(学号、课程编号)——考试成绩
该表的关键字是:(学号、课程编号)
这里的非主属性姓名依赖于学号,是关键字的一部分,而不是全部。所以不满足2NF
需要拆分成两个表
学号 |
姓名 |
101 |
张三 |
102 |
李四 |
学号 |
课程编号 |
考试成绩 |
101 |
201 |
73 |
102 |
202 |
53 |
这样就满足2NF了
3NF:符合1NF和2NF,并且消除传递依赖
学号 |
课程编号 |
老师 |
职称 |
101(张三) |
201(高等数学) |
张老湿 |
砖家 |
102(李四) |
202(大学英语) |
陈教授 |
叫兽 |
103(王五) |
202(大学英语) |
陈教授 |
叫兽 |
显然满足1NF
该表的关键字是:(学号、课程编号)。后面的非主属性完全依赖于关键字,所以满足2NF
(学号、课程编号)——上课老师
老师——职称
像这种A依赖于B,B依赖于C的设计,就称为传递依赖,是不满足3NF
需要拆分成两个表
学号 |
课程编号 |
老师 |
101(张三) |
201(高等数学) |
张老湿 |
102(李四) |
202(大学英语) |
陈教授 |
103(王五) |
202(大学英语) |
陈教授 |
老师 |
职称 |
张老湿 |
砖家 |
陈教授 |
叫兽 |
这样就满足了3NF的标准了
后面还有BCNF、4NF、5NF。但是我们设计数据库一般要求达到3NF即可