高级数据库建模与设计笔记
1、需求文档
2、数据流图
3、数据字典
4、概要设计
5、逻辑设计(本课程只到这一步)
数据流图: 方框里是角色,圆里是动作,箭头是信息的变换,长等号上面是待修改的信息。
数据字典:是个列表。它不只说明字段,而是对数据流中各个元素进行说明。
新感悟:设计表时,面对数据流图,应该先看靠近初始角色的第一个动作,它要操作啥字段,再倒推看角色,补上表的基本字段,根据一事一地原则决定表的字段设计,
然后再跟着流程图往后看,脑子里带着这张表,遇到什么动作,再想这个表要不要加一列。或者加联系表。所以只有两种表,实体表,实体之间的关系表。
不同的流程线路(不同的业务),那就可以设计不同的表。
角色是代码里的枚举值,可以不设置表。
比如,初始角色是学生,最近的第一个动作是教务处审核学籍信息,第二是录入期末成绩。看第一个动作,要审核,它肯定看一条数据,然后点审核按钮,修改status字段,那我倒推看角色,是学生,那学生是对象,建个学生表,要有学号、姓名、年龄、专业等基本信息,还要加个学籍状态字段待审核。
然后看第二个动作,期末成绩,每个学生都有,每个课都有,并且随着学生的增加,数据量不断增大,所以首先要考虑做成分区表,每年学生数量固定,所以可以按年分区,表里得有学号、教师id、课程id、学年、成绩。这样设计合不合适呢?成绩是个对象,但他有不同属性,比如课程,满足一事一地,有三个外键,其中学号和课程id组成联合主键。 如果每门课设计一张表,没啥区别,所以这样设计合理。
按照这个思路,就能设计表了。
投影:比如两列单独拿出来。
笛卡尔积:不同集合的列名相加,元组相乘。
R:n目关系,k1个元组
S:m目关系,k2个元组
笛卡尔积就是:
列:n+m
行:k1*k2
oracle内循环的本质是做笛卡尔积之后,通过a.x=b.z在笛卡尔积中挑出某列值相同的row
数学中的 {形式|内涵},形式就是 表示为什么样,内涵就是需要满足什么条件。
第一范式:列不可再分
第二范式:主键多对一或一对一其他字段
第三范式:其他字段之间,没有传递关系
比如学号,系号,系名 学号到系名在逻辑上就通过系号传递了,所以系名不能在这个表里
码(候选码):一个或一组属性能确定其他属性,他就叫做码或键或候选码或候选键。
闭包:根据一个定理推出的所有规则。
实体表得有属性。
联系也用表来表示。
有其他属性,参与其他联系,就作表,不然可作属性。
er 图中码要加下划线。