数据库设计思想

来源:互联网 发布:java opencv 人脸匹配 编辑:程序博客网 时间:2024/06/05 17:05

1 根据业务需要画出E-R关系图

 

2 根据E-R图转换为关系模型的规则设计表

 1.1.3.1 把E-R图转换为关系模型Relational Scheme

我们使用关系模型集合来表示数据的方法称为关系型数据库模式(Relational Database scheme),但我们应该遵循何种方法来使用关系模型呢?通常存在着标准的模式,即先用实体-关系模型建模,然后把E-R图存储为关系模型,定义在关系型数据库里。

□首先,作为E-R图中的一个抽象实体E,直接对应于关系模型中的一个关系,该关系的逻辑模式包含了E的所有的属性。该实体的实体集可以存储为关系表,即实体集中的每一个具体的实体对应于关系的每一个元组。如果在用关系R表示E的同时,也要保存其它的实体集F,则也需要纳入F的属性。

□ 如果需要一个关系R表示多个实体集E1, E2, … Ek之间的联系,则关系R的属性集里一定要包括每个实体集的关键字,如果这些实体之间存在着多个重名的字段,则需要修改重复的字段名。

对于“关系”,在数据库的处理中有默认隐含的关系和显示地定义两种:

□ Example 1.1.3.1.1 显式的关系

两个实体集:Employee(em_id,name,age,major,dep_id)

        Department(dep_id,name,responsibilty)

在这个例子中,有两个实体集,一个是雇员集,一个是部门集。在这个实体-关系模型中,雇员与部门之间存在着多对一的关系,这种关系我们没有单独用一个关系表(Relation)进行存储。因为在雇员关系表中,有一个属性已经能够明确表明这种映射,不用单独建立一个映射关系表了。

□ Example 1.1.3.1.2 隐式的关系

三个实体集:Student(Enroll_id,name,age,major,HomeTown,IdenCo)

        Course(Course_id,description,Teacher,aim,Hours)

   ElectCourse(Enroll_id,Course_id,Year,Term,Score)

在这个例子中,我们注意到E-R模型中存在着3个实体集,但只有两个真实的静态的实体集,一个是学生实体集,另外一个是课程实体集,实际上在E-R图上我们能够见到的也就是这2个实体集。我们注意到这两个实体集之间的关系是多对多的关系,即一个学生可以选择多个课程,同时一个课程可以由多个学生选择。由于目前的关系型数据库是一个二维(2-dimensional)结构,不支持在一个单元中继续存储关系,所以对这种多对多的关系必须分解成一对多(或一对一)的关系。所以我们必须显示地分解,即引入选课关系electCourse,记录下每一个学生的具体选课情况。

□    从实体关系模型到关系模式如果需要,可以做优化工作。

我们没有必要原封不动地,照本宣科地把实体-关系模型中的实体集机械地转换成关系模型,有时候可以合并若干实体集,还有的时候需要把一个实体集分解为多个。这一工作需要考虑数据库的范式理论,即1NF,2NF,3NF,BCNF等等。关于范式理论请参阅相关的资料;同时还要考虑系统的运行效率、可移植性、开发成本等等相关的因素。

 

 

E-R模型就是实体关系模型(Entity Relationship Model)。
关系物理形态就是数据库中的基本表。
我们根据业务需求绘出相应的E-R模型图,
然后将E-R模型转为关系。这样就完成了数据库的设计。

E-R模型转为关系的步骤是
1.实体的转换
   每个实体都需要用一个关系来表示,并将实体的属性表达为关系的属性。
2.联系的转换
   此联系就是“实体关系”中的“关系”,只是为了区分物理形态为基本表的关系。
   E-R模型共用三种联系:
   1.一对一用1:1表示
   2.一对多用1:N表示
   3.多对多用M:N表示
   
   2.1 一对一联系 
         1.若双方部分的参与,则将联系定义为一个新的关系,属性为参与双方的码
            例子:A场的职工配偶是本场的职工,同时只有部分职工有配偶,则关系可以设计如下:
    职工(职工号,职工名)
    配偶(丈夫职工号,妻子职工号)
  2.若一方全部参与,则将联系另一方的码作为全部参与一方的属性
              每个部门都有一个职工作为它的管理者,反过来只有部分职工是部门的管理者.        
     则则关系可以设计如下:
     职工(职工号,职工名)
       部门(部门号,部门名,管理者职工号)
   2.2 一对多联系
         将单方参与实体的码作为多方参与实体的属性
         1.一个班级有多个学生,只有一个班主任.
      则关系可以设计如下:     
            教师(教工号,教工名)
      学生(学生号,学生名,班主任教工号)       
         2.多个职工有一个领导,领导也是职工
            则关系可以设计如下:
   职工(职工号,职工名,领导职工号)
   2.3 多对多联系
   将联系定为新的关系,属性为参与双方的码
       学生可以选修多门课程,一门课程可以有多个学生
   则关系可以设计如下:
       学生(学生号,学生名)
          课程(课程号,课程名)
   选修(学生号,课程号)  

3.根据范式规则重新审查建立的表是否符合第三范式

 

 

范式:使模式的函数依赖满足特定要求的模式叫范式.
做好数据库范式是需要离散数学方面的知识.
范式主要分为:
1.第一范式
2.第二范式
3.第三范式
4.BCNF
5.第四范式
6.第五范式

浏览本文之前做如下约定:
关系 <-> 表
属性   <-> 字段
元组 <-> 记录
插入异常:在进行插入数据时,无法将数据插入到数据库中,关系数据库无法操作,即为插入异常。
删除异常:删除一个关系中不必要的信息时,将不该删除的信息也删除了,即为删除异常。
更新异常:对数据库进行更新时,如有疏漏,某些记录被漏改,造成数据的不一致而出错,这即是更新异常。

1.第一范式:如果关系模式R(U,F)中如果每个属性值都是不可再分的最小数据单位,则称R是第一范式的关系。
   例1:用"职工号","姓名","电话号码"三个字段来组成一个表,其中"电话号码"字段的值可以是公司的电话号码
   也可以是家里的电话号码.那么如何把它分解为第一范式,我们可以
   一.电话号码为关键字,重复存储职工号和姓名.
             二.职工号为关键字,电话号码分为单位电话和住宅电话两个属性.
   三.是职工号为关键字,但强制每条记录只能有一个电话号码。
             以上三个方法,第一种方法最不可取,因为它造成了冗余,按实际情况选取后两种情况。

2.第二范式:如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。
 选课关系SCI(SNO,CNO,GRADE,CREDIT) 其中
 1.SNO是学号
 2.CNO是课程号
 3.GRADE是成绩
 4.CREDIT是学分
     由语义可知,关键字为组合关键字(SNO,CNO)
 在应用中使用以上关系模式会出现以下问题
 A.数据冗余,假如同一门课程由100个学生选修,则这门课程的学分要重复储存100次,而实际上一门课程对应一个          学分.
 B.更新异常,若要重新调整学分,则相应的元组的CREDIT的属性值都要更新,假如更新不完全,则有可能出现一门课程对
  应多个学分.
 C.插入异常,若计划开新课,需要把新课对应的学分插入到数据库,但此时没有学生选修该课程,也就是没有学生号关键            字,则导致插入不进去,直到有人选择该课程.
 D.删除异常,若学生已经结业,需要从当前数据库中删除选修记录,但与此同时,CNO,GRADE的信息也被删除了.
    原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
    解决方法:分解成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT) 
   其实这与我在另一篇文章里面说的两个实体A,B,它门是M:N的联系,则将联系定义为新的关系,属性为双方的码是一样的        道理.

3. 第三范式:如果关系模式R(U,F)中所有的非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式
    例3:
    如S1(SNO,SNAME,DNO,DNAME,LOCATION)各属性含义如下
    1.SNO 学号
    2.SNAME 姓名
    3.DNO 所在系
    4.DNAME 系名称
    5.LOCATION 系地址
    关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的,
1.SNO学号->DNO所在系
2.DNO所在系-\->SNO学号
3.DNO所在系->LOCATION系地址
所以SNO学号->LOCATION系地址是传递依赖的
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。
    

4 做练习