11.E-R图

本章目标

  • 设计E-R图
  • 设计范式
  • PowerDesigner

本章内容

一、E-R图

1、概念数据模型

概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计。

概念数据模型是现实世界中数据特征的抽象。数据模型应该满足三个方面的要求:

  • 能够比较真实地模拟现实世界
  • 容易为人所理解
  • 便于计算机实现

通常人们先将现实世界抽象为概念世界,然后再将概念世界转为机器世界。换句话说,就是先将现实世界中的客观对象抽象为实体(Entity)和联系 (Relationship),它并不依赖于具体的计算机系统或某个DBMS系统,这种模型就是我们所说的CDM;然后再将CDM转换为计算机上某个 DBMS所支持的数据模型,这样的模型就是物理数据模型,即PDM。

2、E-R图

可以通过Visio,Draw.io等工具来画

实体-联系图(Entity Relationship Diagram),提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型

构成E-R图的基本要素是实体型、属性和联系,其表示方法为:

2.1、实体型(Entity)

具有相同属性的实体具有相同的特征和性质,用实体名及其属性名集合来抽象和刻画同类实体;在E-R图中用矩形表示,矩形框内写明实体名;比如员工张三、员工李四都是实体

弱实体:一个实体的键是由另一个实体的部分或全部属性构成。弱实体是在矩形外面再套实线矩形。如在人事管理系统中,职工子女的信息就是以职工的存在为前提的,子女实体是弱实体

2.2、属性(Attribute)

实体所具有的某一特性,一个实体可由若干个属性来刻画。在E-R图中用椭圆形表示,并用无向边将其与相应的实体连接起来;比如员工的姓名、工号、性别、都是属性

多值属性:属性可以有一个或两个以上的值,如员工的电话,可以是手机号码,也可以是住宅电话。多值属性在椭圆形外面再套实线椭圆。

派生属性:属性的值必须通过计算才能得出来,用虚线椭圆表示。如员工的工资表中,实发工资就是由基本工资、岗位工资等计算出来的

2.3、联系(Relationship)

信息世界中反映实体内部或实体之间的联系。实体内部的联系通常是指组成实体的各属性之间的联系;实体之间的联系通常是指不同实体集之间的联系。在E-R图中用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型(1 : 1,1 : n或m : n)。 比如员工所在部门的所属关系,员工拥有工资的拥有关系。

3、实体集之间的联系

  • 1:1 联系:如果对于A中的一个实体,B中至多有一个实体与其发生联系,反之,B中的每一实体至多对应A中一个实体,则称A与B是1:1联系。
  • 1:n 联系:如果对于A中的每一实体,实体B中有一个以上实体与之发生联系,反之,B中的每一实体至多只能对应于A中的一个实体,则称A与B是1:n联系。
  • m:n 联系:如果A中至少有一实体对应于B中一个以上实体,反之,B中也至少有一个实体对应于A中一个以上实体,则称A与B为m:n联系

4、概念模型的表示方法

ER图是直观表示概念模型的工具,ER图的基本思想就是分别用矩形框、椭圆形框和菱形框表示实体、属性和联系,使用无向边将属性与其相应的实体连接起来,并将联系分别和有关实体相连接,注明联系类型

表示实体集之间的联系

二、数据库范式

1、简介

关系型数据库设计时是要遵循一定的规则的,尤其是数据库的设计范式。现简单介绍一下1NF(第一范式)、2NF(第二范式)、3NF(第三范式),另有第四范式和第五范式(第四范式和第五范式属于范式中的较高要求的范式)

  • 1NF(第一范式)
  • 2NF(第二范式)
  • 3NF(第三范式)
  • 4NF(第四范式)
  • 5NF(第五范式)

2、第一范式(1NF)

在关系模式R中的每一个具体关系,如果每个属性值都是由不可分割的最小数据单位组成或者说每个属性的值必须是唯一的,则称R属于第一范式。

例如:由“职工号”、“姓名”、“电话号码”组成的表(一个人可能有一个办公室电话和一个家庭电话号码),这时将其规范成为1NF有三种方法:

  • 重复存储“职工号”和“姓名”。此时,关键字只能是“电话号码”。
  • “职工号”为关键字,“电话号码”分为“单位电话”和“住宅电话”两个属性。
  • “职工号”为关键字,但强制每条记录只能有一个电话号码

以上三个方法,第一种方法最不可取,按实际情况选取后面两种情况。

3、第二范式(2NF)

如果关系模式R(U,F)中的所有非主键属性都完全依赖于任意一个候选关键字(通常为主键),即所有非主键列的值都完全信赖于主键列,则称关系R属于第二范式。

例如:在选课关系表SCI(SNO,CNO,GRADE,CREDIT)中,SNO为学号,CNO为课程号,GRADE为成绩,CREDIT为学分。由以上条件可知,关键字为组合关键字(SNO,CNO)。在应用中使用以上关系模式有以下问题:

  • 数据冗余即数据重复,假设同一门课有40个学生选修,学分就重复40次。
  • 更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课程学分不同的情况。
  • 插入异常,如计划开新课,由于没人选修,因此就没有学号关键字,只有学生选修后才能把课程和学分存入。
  • 删除异常,若学生已结业,从当前数据库删除选修记录。若某些课程新生尚未选修,则此门课程及学分记录将无法保存。

原因:非关键字属性CREDIT仅依赖于CNO,也就是说CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。

解决方法:分成两个关系模式SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,在需要时再进行联接。

4、第三范式(3NF)

如果关系模式R(U,F)中的所有非主属性对于任何候选关键字都不存在传递依赖,则称关系R属于第三范式。

例如:存在一个部门信息表,其中每个部门有部门编号(dep_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。

如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。 即如果一个表中的任意三列A、B、C,存在着A决定B,且B决定C的情况,那么这个表就不属于第三范式,因为A可以通过传递依赖决定C,这时应该将传递依赖分解到两个表中。

三、PowerDesigner

1、PowerDesigner简介

PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型,可以生成多种客户端开发工具的应用程序,还可为数据仓库制作结构模型,也能对团队设计模型进行控制。

PowerDesigner致力于采用基于Entity-Relation的数据模型,分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库进行设计。

概念数据模型描述的是独立于数据库管理系统(DBMS)的实体定义和实体关系定义。 物理数据模型是在概念数据模型的基础上针对目标数据库管理系统的具体化。

2、PowerDesigner功能

这是一个强大的数据库设计工具,使用DataArchitect可利用实体-关系图为一个信息系统创建“概念数据模型”-CDM(Conceptual Data Model)。并且可根据CDM产生基于某一特定数据库管理系统(例如:Sybase System 11)的“物理数据模型”-PDM(Physical Data Model)。还可优化PDM,产生为特定DBMS创建数据库的SQL语句并可以文件形式存储以便在其他时刻运行这些SQL语句创建数据库。另外,DataArchitect还可根据已存在的数据库反向生成PDM,CDM及创建数据库的SQL脚本

3、解决实体属性不能重名

PowerDesigner默认在CDM中不能存在相同名称的实体属性,这也是考虑到可能产生的一些如主键外键等名称冲突问题,但当我们进行实际数据库设计时,可能会多次使用相同数据项(DataItem)便于理解各实体。为此需要对更改PowerDesigner相关 设置。软件默认为DataItem不能重复使用(重名),需要进行以下操作:

选择Tools->Model Options,在Model Setting设置目录中,将Data Item下的Unique Code取消选中即可,系统默认将Unique Code和Allow Reuse均选中。

4、实体之间多对多结构设计

在设计多对多关系时,需要用第三张表来体现,在pd中第三张表无须手动创建,只需要设计为多对多,会自动生成第三张表:如下:

学生表(student)

字段 类型 说明
stu_id bigint 学生编号
stu_name varchar(20) 学生姓名
…… …… ……

课程表(course)

字段 类型 说明
c_id bigint 课程编号
c_name varchar(20) 名称
credit int 学分

选课表(course_selection)

字段 类型 说明
stu_id bigint 学生编号
c_id bigint 课程编号
score float 成绩

5、powerdesigner生成excel文件(脚本)

参考网址:https://blog.csdn.net/m0_37172770/article/details/126355278

脚本

’将powerdesigner 建好的表导出为excel文件 ’1、使用Ctrl+Shift+X打开编辑页面 ’2、复制以下代码

'将powerdesigner 建好的表导出为excel文件
'1、使用Ctrl+Shift+X打开编辑页面
'2、复制以下代码
Option Explicit
   Dim rowsNum
   rowsNum = 2

Dim Model
Set Model = ActiveModel
If (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) Then
  Debug.print "null"
Else
    ' Get the tables collection
    '创建EXCEL APP
    dim beginrow
    DIM EXCEL, SHEET
    set EXCEL = CREATEOBJECT("Excel.Application")
    EXCEL.workbooks.add  '添加工作表
    SET sheet = EXCEL.workbooks(1).sheets(1)
    sheet.name ="数据字典"

   sheet.Range(sheet.cells(1, 1),sheet.cells(1, 9)).Merge
   sheet.cells(1, 1) ="标题"
   sheet.Range(sheet.cells(1, 1),sheet.cells(1, 9)).Interior.Color=rgb(146,208,80)

   rowsNum=2
   beginrow = rowsNum+1

   Dim tab
   For Each tab In Model.tables
      TableLoop tab,SHEET
   Next

    EXCEL.visible = true
    '设置列宽和自动换行
    sheet.Columns(1).ColumnWidth  =10
    sheet.Columns(2).ColumnWidth  =15
    sheet.Columns(4).ColumnWidth  =20
    sheet.Columns(5).ColumnWidth  =15
    sheet.Columns(6).ColumnWidth  =15

    sheet.Columns("C:C").EntireColumn.AutoFit
    sheet.Columns("i:i").EntireColumn.AutoFit
 End If

Sub TableLoop(tab, sheet)
   If IsObject(tab) Then
      Dim rangFlag
      rowsNum = rowsNum + 1

      sheet.cells(rowsNum, 1) = "表名"
      sheet.Range(sheet.cells(rowsNum, 3),sheet.cells(rowsNum, 9)).Merge
      sheet.cells(rowsNum, 2)=tab.code
      sheet.cells(rowsNum, 3)=tab.name
      sheet.Range(sheet.cells(rowsNum, 1),sheet.cells(rowsNum, 9)).Borders.LineStyle = "1"
      sheet.Range(sheet.cells(rowsNum, 1),sheet.cells(rowsNum, 9)).Interior.Color=rgb(141,180,226)
      sheet.Range(sheet.cells(rowsNum, 1),sheet.cells(rowsNum, 9)).Borders.Weight ="3"

      rowsNum = rowsNum + 2
      sheet.cells(rowsNum, 1) = "中文名"
      sheet.cells(rowsNum, 2) = "字段名"
      sheet.cells(rowsNum, 3) = "类型"
      sheet.cells(rowsNum, 4) = "长度"
      sheet.cells(rowsNum, 5) = "主键"
      sheet.cells(rowsNum, 6) = "索引"
      sheet.cells(rowsNum, 7) = "不可空"
      sheet.cells(rowsNum, 8) = "默认值"
      sheet.cells(rowsNum, 9) = "说明"
      sheet.Range(sheet.cells(rowsNum,1),sheet.cells(rowsNum,9)).Interior.Color=rgb(166,166,166)

      Dim col ' running column
      Dim colsNum
      colsNum = 0
      for each col in tab.columns
         rowsNum = rowsNum + 1
         colsNum = colsNum + 1
         sheet.cells(rowsNum, 1) = col.name
         sheet.cells(rowsNum, 2) = col.code
         sheet.cells(rowsNum, 3) = col.datatype
         sheet.cells(rowsNum, 4) = IIF(col.Length<>0,col.Length,"")
         sheet.cells(rowsNum, 5) = IIF(col.Primary,"√","")
         sheet.cells(rowsNum, 6) = IIF(col.Primary,"√","")
         sheet.cells(rowsNum, 7) = IIF(col.Mandatory,"√","")
         sheet.cells(rowsNum, 8) = "无"
         sheet.cells(rowsNum, 9) = col.comment
      next

      '设置边框
      DIM RanagBorder
      SET RanagBorder =sheet.Range(sheet.cells(rowsNum-colsNum,1),sheet.cells(rowsNum,9))
      RanagBorder.Borders.LineStyle = "1"
      'RaneBorderFun RanagBorder

      rowsNum = rowsNum + 1

   End If
End Sub

function IIF(flg,tstr,fstr)
   if flg then
      IIF= tstr
   else
      IIF= fstr
   end if
End function
posted @ 2025-04-10 12:02  icui4cu  阅读(188)  评论(0)    收藏  举报