数据库设计
1.软件开发的流程:
立项=>需求分析=>概要设计(数据库设计)=>详细设计=>开发实现=>测试=>交付实施=>运维
2.数据库设计的基本流程:
根据业务的需求找出相应的实体类,然后把这些实体类映射成数据库对象(表),再考虑实体的属性,也就是表格的列,最后考虑实体之间的关系,也就是表格之间的关系。
a.数据设计画图
数据库设计常用的工具:
1.sybase公司,powerDesigner,功能强大,收费
2.ERWIN-Studio,功能比较强大,收费
3.JUDE,日本开发的开源,免费
E-R图(Entity-Relationshiop),实体关系映射图
它的核心就是映射(mapping);【后面具体介绍】
1.实体名,映射成表
2.属性,映射成列名
3.对象标识符,映射成主键约束
4.实体关系,映射成表之间的关秀(外键约束)
映射举例:
实体类 表
名字 user 列名:tbl_user
属性 id 主键:id
属性 name 列名:name
属性 password 列名:password
实体类之间的关系:
一对一 映射成外键
例: 丈夫/妻子类
一对多 映射成外键
例:顾客和订单
多对多 拆分成2个一对多,再映射成外键
例:学生和课程
自关联 映射成外键
例:员工实体类
根据实体类设计表:
外键,引用自己表或者另外的表中的主键,从而产生关联。
主键:特点非空唯一,映射实体中的对象标识,数据库中的通过主键来区分行记录。
一对一:外键可写在任意表中,但是一般写在业务意义的从表中。
例:book书类,bookinfo详细信息类,区分主表和从表
一对多:外键写在表多的一方
多对多:利用中间表,拆分成两个一对多
优势:当你再增加一个属性,两边都不好写,可以在中间表中添加
例:添加分数90,发现学生表不知道哪门课程90,课程表不知谁90
分数:额外列
额外列:必须有对应的实体
d.自关联:引用自身主键作为自己的外键,使表中行记录产生关联关系
注意:
1.外键一般出现在表多的地方,映射具有方向性
2.实体类中没有外键的概念,数据库中才有外键的概念
三大范式:
数据库三大范式,也是数据库设计的准则
是一种数据库设计思想,
可以帮助数据设计人员,
以一种非常好的思路和架构来设计数据库。
1NF:原子性。也就是说表中任何一个列都是唯一的,不可再拆分的。
如:
多数国外项目中,R(id,name,age),其中name可以分为:first_name,last_name。
所有此设计是不符合1NF的,应重新设计为:
R(id,first_name,last_name,age)
如:国内地址一栏,要分为省,市,区,详细地址
注意:原子性也不是拆的越多越好,比如把年龄分成个位和十位,无意义
2NF:在1NF的基础上,不存在非关键列部分依赖于关键列,也就是说所有非关键列部分都必须完全依赖于关键列。
如:
R(id,sname,cname,sore)
值(1,张三,数学,90)
由于以上不管是以哪一列作为关键列,都存在 其他 非关键列 部分依赖于 主关键列,
所以此设计是不符合2NF,应该重新设计为:
R1(sid,sname)存放学生信息的表
R2(cid,cname)存放课程信息的表
R3(sid,cid,score)存放学生与课程考试成绩的中间表
3NF :在2NF的基础上,不存在 非关键列传递函数 依赖于关键列,也就是说,所有的非关键列 都 必须 直接依赖于关键列
如:
如果A依赖于B,B依赖于C,我们就说A传递函数 依赖于C
学生考入某所大学的信息表:
R(sid,sname,uid,uname,uphone,address)
如果以sid作为关键列,sname,uid是直接依赖于sid,
但是uname,uphone,address这三列都是直接依赖于uid,
所以此设计不符合3NF,应重新设计为:
R1(sid,sname,uid)存放学生信息表
R2(uid,uname,uphone,address)存放大学信息的表