Skip to main content

快速入门:ER图

· 约19分钟
Proca

现在,你要设计一个数据库,来存储和管理你的数据,比如学生信息、订单信息、商品信息等等。但是你不知道如何开始,如何把你的数据转化为数据库中的表和字段,如何确定表和表之间的关系。

所幸的是,你听说过一种叫做ER图的工具,可以帮助你完成这个任务,但是你不清楚它是什么,更不知道如何使用它。

如果你有这样的困惑,请继续看下去!在这篇文章中,我们将从以下三个方面介绍怎么画ER图:ER图是什么ER图的绘图规范ER图的绘制步骤

ER图是什么

ER图(Entity Relationship Diagram),即实体关系图,是一种用来描述现实世界中的数据对象和它们之间的联系的概念模型。

所谓数据对象,就是指现实世界中存在的并且可以相互区别的事物,比如学生、课程、订单等。而联系就是指数据对象之间存在的某种关联关系,比如学生选课、订单包含商品等。

ER图可以帮助我们把现实世界中的数据需求转化为数据库中的表和字段,规划新系统或者记录现有系统的数据结构。 比如,我们可以用ER图来表示一个学生选课系统的数据模型,把学生、课程、选课等数据对象和它们之间的联系画出来, 然后根据一些规则或者工具,把ER图中的元素映射到数据库中的表、字段、约束等元素。这样,我们就可以方便地设计和开发我们的数据库系统了。

一般来说,ER图主要由以下五个元素组成:

实体集合:实体集合是指具有相同属性的数据对象的集合,比如学生、课程、订单等。 在UML类图中,实体集合用矩形框表示,并在框中写上实体名,实体名一般用单数形式;

属性:属性是指实体或联系所具有的某一个特性,比如学生的姓名、课程的名称、订单的金额等。 在UML类图中,属性写在实体框内的第一个区域,并用不同的符号来表示属性的可见性(公有、私有、保护或者包内);

联系:联系是指实体之间或者实体和联系之间存在的某种关联关系,比如学生选课、订单包含商品等。 在UML类图中,联系用直线将实体连接起来,并在直线两端用不同的符号来表示联系类型和多重性;

联系类型:联系类型是指联系的种类和多重性。联系的种类指的是实体之间的关系的本质,比如关联、聚合、组合、泛化等。联系的多重性指的是实体之间的关系的数量,比如一对一、一对多、多对多等。 在UML类图中,联系类型用不同的符号来表示,比如空心菱形、实心菱形、空心三角形等;

关键字:关键字是指可以唯一标识一个实体或者一个联系的属性或者属性组合,它是实体或者联系的主要特征,也是数据库中的主键。在我们下面会展示的图中,关键字用小黑点标注在实体或者联系的属性名前面。 比如,学生这个实体的关键字是学号,选课这个联系的关键字是学号和课程号的组合。

PlantUML快速入门

在许多ER图绘制教程中,都会提到Chen表示法,它是由出生于中国台湾的Peter Chen(陈品山)提出的,是最早的ER图表示法之一。

在Chen表示法中,使用矩形表示实体集,椭圆形表示属性,菱形表示关系。然而,随着数据规模的增大,当实体属性过多时,Chen表示法的图形会产生非常多的椭圆,ER图的可读性也因此变差。

Crow’s foot表示法是由Gordon Everest提出的,它是Chen表示法的一种改进,用来解决Chen表示法中实体属性过多的问题。

而现在流行的UML类图式方法,正是Crow’s foot表示法的一种实现。你可能对UML类图有所耳闻,它是一种用来描述面向对象程序设计的统一建模语言(UML)的图形化语言,它的主要作用是帮助程序员理解和设计程序。

自然,要画这样的UML类图就需要对应的工具,本文使用的便是plantuml,它可以根据一种简单的文本语言来生成UML类图,而且支持多种输出格式,包括PNG、SVG、PDF等。 因此现在,你有必要对plantUML的语法有一个初步的了解。

plantUML的基本语法是:

• 以 @startuml 开头,以 @enduml 结尾,表示一个uml图的范围;

• 以 开头的行表示注释,不会被解析为图形;

• 使用关键字来表示不同类型的uml图,如 classentitysequenceusecase 等;

• 使用括号、冒号、分号等符号来表示图形的属性、方法、关系等;

• 使用 skinparam 命令来设置图形的全局样式;

• 使用 !include 命令来引用外部文件或者url中的定义。

info

更多的语法可以参考 官方文档:https://plantuml.com/zh/

下面是一个简单的例子,你可以试着编辑输入框中的内容,输入框中的内容发生改变后,对应的图像就会被生成:

plantuml

ER图的绘图规范

现在,相信你对plantUML有了一定的掌握,接下来,我们就可以开始画ER图了。

要画好ER图,我们需要遵循一套固定的符号和规则,用来表示ER图中的各种元素。

UML类图式的ER图,其主要规范有以下几点:

1. 用矩形框表示实体集合,在框中写上实体名,使用英文时,实体名一般用单数形式。

例如,如果我们要画一个网上商城的ER图,我们可以用矩形框来表示用户、商品和订单三个实体集合,并在框中写上它们的名字;

er1

2. 在实体框内分两个区域,分别写上实体的主键属性和其他属性,属性可以用<<generated>>、<<PK>>、<<FK>>等标签来表示它们是否是主键或者外键。

对于上面的用户实体,我们可以在其内部分两个区域,第一个区域写上用户实体的主键属性,比如用户ID,并用<<PK>>标签来表示用户ID是主键;第二个区域写上用户的其他属性,比如用户的姓名、邮箱、地址、电话等;

er2

3. 在实体中,你可以用黑色圆点标记符来表示实体的某个属性是必须的,并且能够唯一地标识实体的实例。

我们可以在用户实体中用黑色圆点来表示用户ID是必须的,并且能够唯一地标识用户的实例;

er5

可以看到,实体的主键属性前面会有一个黑色的小圆点,而其他属性前面没有小圆点。现在,我们的用户实体才算得上完整。

4. 将实体和联系连接起来,并在两端用不同的符号来表示联系类型。在联系线上可以写上联系名,表示联系的含义。

为了表示实体之间的关系,我们可以用直线将用户和订单连接起来,并在直线两端用不同的符号来表示联系类型和多重性。在这里,我们可以用如下所示的记号来表示一个用户可以下多个订单,一个订单只属于一个用户,这是一个一对多的联系。在联系线上,我们可以写上“下单”这个联系名,表示用户下订单这个动作;

er3

info

你可能对如何选择关系符号感到些许困惑,下面是一些指导原则:

首先,你需要确定两个实体之间的基数(cardinality)和依赖性(dependency)。基数表示实体之间的数量关系,依赖性表示实体之间的存在关系。 基数可以是零或一、恰好一、零或多、一或多等。依赖性可以是强依赖(用实线表示)或弱依赖(用虚线表示)。 强依赖意味着如果整体不存在,则部分也不存在;弱依赖意味着即使整体不存在,部分也可以存在。

接着,把实体之间的数量关系、依赖关系翻译成符合plantUML语法的符号: 表示基数的符号有 o , | , {},分别表示零,一,多。表示依赖性的符号有 --(实线)和 ..(虚线),分别表示强依赖和弱依赖。

例如,我们上方关于顾客与订单之间关系的案例中,顾客与订单之间的基数是一对多,依赖性是强依赖,所以我们用 顾客 ||--o{ 订单 来表示,即一个顾客可以有零或多个订单,一个订单只属于恰好一个顾客,且如果顾客不存在,则订单也不存在。

更多例子可以参考下方的 绘制步骤

ER图的绘制步骤

为了让你更容易理解,我将用一个具体的例子来说明每个步骤,并附上每个步骤的plantUML代码。假设你要设计一个图书馆管理系统的数据库,你需要存储和管理图书、读者、借阅等信息。那么,你可以按照以下步骤来绘制ER图:

步骤1 确定所有的实体集合

实体是指现实世界中可以区分的事物,比如人、物、事件等。实体集合是指具有相同属性的实体的集合,比如所有的图书、所有的读者等。在这个例子中,你可以确定以下几个实体集合:

• 图书(Book)

• 读者(Reader)

• 借阅(Borrow)

在ER图中,你可以用矩形框来表示实体集合,并在框中写上实体名。例如:

@startuml
entity 图书 {
...
}

entity 读者 {
...
}

entity 借阅 {
...
}
@enduml

效果如下:

3.1

步骤2 确定实体集应包含的属性

属性是指实体所具有的特征或性质,比如姓名、编号、价格等。属性可以用来描述或区分实体,确定什么属性取决于具体需求。在这个例子中,我们可以确定如下属性:

• 图书(Book)

编号(ID)、书名(Title)、作者(Author)、出版社(Publisher)、价格(Price)

• 读者(Reader)

编号(ID)、姓名(Name)、性别(Gender)、电话(Phone)、邮箱(Email)

• 借阅(Borrow)

借阅日期(Date)、归还日期(Return)

顺便地,我们可以确定哪些属性是主键或外键,哪些是必须的,并且能够唯一地标识实体的实例。特别地,我们使用星号 * 表示黑色圆点。

于是,根据上面的步骤,我们可以写出以下代码:

@startuml 

entity 图书{
*book_id : int <<PK>>
*title : varchar(100)
author : varchar(50)
publisher : varchar(50)
price : decimal(10,2)
}

entity 读者{
*reader_id : int <<PK>>
*name : varchar(20)
gender : char(1)
phone : varchar(15)
email : varchar(50)
}

entity 借阅{
*borrow_id : int <<PK>>
--
*book_id : int <<FK>>
*reader_id : int <<FK>>
*borrow_date : date
return_date : date
}

@enduml

效果也很符合我们的预期:

3.2

步骤3 确定实体集之间的联系

联系是指不同实体之间存在的某种关联或关系,比如一对多、多对多等。联系可以用来表示实体之间的相互作用或依赖。在这个例子中,你可以确定以下几个联系:

  1. 图书与借阅之间存在一个一对多的联系,即一本图书可以被多次借阅,也可以一次都不被借阅,但一次借阅只能对应恰好一本图书。

  2. 读者与借阅之间存在一个一对多的联系,即一个读者可以借阅多本图书,也可以一本都不借阅,但一次借阅只能对应一个读者。

代码就这么写:

@startuml

entity 图书{
*book_id : int <<PK>>
*title : varchar(100)
author : varchar(50)
publisher : varchar(50)
price : decimal(10,2)
}

entity 读者{
*reader_id : int <<PK>>
*name : varchar(20)
gender : char(1)
phone : varchar(15)
email : varchar(50)
}

entity 借阅{
*borrow_id : int <<PK>>
--
*book_id : int <<FK>>
*reader_id : int <<FK>>
*borrow_date : date
return_date : date
}

图书 ||--o{ 借阅
读者 ||--o{ 借阅

@enduml

最终,我们的ER图就绘制完成了:

3.3

info

借阅这个实体,其实是一个关系,它包含了图书和读者两个实体的主键,因此,它也可以被称为关系实体。在Chen表示法中,关系实体使用菱形来表示,而在UML类图式方法中,关系实体使用矩形来表示。

并且在这里,我们一步到位地把关系实体的属性也完整地写出来了,但在Chen表示法中,关系实体的属性是在ER图转换成关系模式时才完整写出来的。

总结

在本文中,我们介绍了怎么画ER图,即实体关系图,这是一种用来描述数据对象和它们之间的联系的概念模型。

我们从三个方面讲解了ER图的绘制方法:

ER图是什么

ER图主要由实体集合、属性、联系、联系类型和关键字五个元素组成,它可以帮助我们把现实世界中的数据需求转化为数据库中的表和字段;

ER图的绘图规范

ER图可以用不同的表示法来绘制,比较流行的一种是UML类图式方法,它用矩形框表示实体集合,用直线或虚线表示联系,用不同的符号表示联系类型和多重性;

ER图的绘制步骤

ER图的绘制步骤主要包括确定实体集合和属性、确定关键字、确定联系和联系类型等。我们需要分析现实世界中的数据对象和它们之间的关系,然后用UML类图式方法画出ER图。

当然,这个分析和确定的过程还有很多细节需要注意,但作为快速入门,我们只需要掌握这些基本的步骤。

现在,你对ER图已经拥有一定的了解了,不仅知道它是什么,还知道了它该怎么画。动手画一个ER图吧!

支持一下

暂无评论,来留下友好的评论吧