实体关系图及绘制方法(非原创)
实体关系图及绘制方法
实体关系图也被称为 ERD、ER 图、实体联系模型、是一种用于数据库设计的结构图,用以描述数据库建模实体及实体间关系.
ER符号指南
实体
ERD 实体是一个系统内可定义的事物或概念,如人/角色(例如学生),对象(例如发票),概念(例如简介)或事件(例如交易)(注:在 ERD 中,术语“实体”通常用来代替“表”,但它们是一样的)。在考慮实体时,嘗試把它们想成名词。在 ER 模型中,实体显示为圆角矩形,其名称位于上方,其属性列在实体形状的主体中。下面的 ERD 示例显示了 ER 实体的一个用例。
实体属性
也称为列 (Row),意思是持有它的实体的属性或特性。
一个属性有一个描述属性的名称和一个描述属性种类的类型,例如代表字符串的 varchar,整数的 int。当为物理数据库开发绘制 ERD 时,得使用目标 RDBMS 支持的类型,以確保設計和物理数据库的一致性。
下面的 ER 图示例显示了一個包含属性的实体。
主键 (Primary Key)
主键又称 PK,是一种特殊的实体属性,用于界定数据库表中的记录的独特性。
外键 (Foreign Key)
外键又称外来键和外部键,是对主键的引用,用于识别实体之间的关系。请注意,有别于主键,外键不必是唯一的,多个记录可以共享相同的值。
关系
两个实体之间的关系表示这两个实体以某种方式相互关联。例如,学生可能参加课程。实体“学生”因此与“课程”相关,而这关系则在 ER 图中以连接线表达着。
基数 (Cardinality)
基数定义了一个实与另一个实体的关系里面,某方可能出现次数。例如,一个团队有许多球员,若把这关系呈现于 ERD 时,团队和球员之间是一对多的关系。
一对一的基数的例子
一对一关系主要用于将实体分成两部分,简洁地将资讯呈现,使读者更容易理解。下图显示了一对一关系的示例。
一对多的基数的例子
一对多关系是指两个实体 X 和 Y 之间的关系,其中 X 的一个实例可以链接到Y的许多实例,而 Y 的一个实例仅链接到 X 的一个实例。下图显示了一对多关系的一个例子。
多对多的基数的例子
多对多关系是指两个实体 X 和 Y 之间的关系,其中 X 可以被链接到 Y 的许多实例,反之亦然。下图显示了一个多对多关系的例子。请注意,多对多关系在物理 ERD 中被分成一对一对多的关系,你会在下一节中學到什麼是物理 ERD。
概念,逻辑和物理数据模型
虽然 ER 模型的三个层次都包含有属性和关系的实体,但它们的创建目的和目标受众都不同。
一般而言,业务分析人员使用概念和逻辑模型来展示系统中存在的业务对象 (Business Object),而数据库设计人员或数据库工程师會為概念和逻辑ER模型加入更详细的資訊,進而生成反映物理模型结构的物理数据模型,好為创建数据库作準備。下表列出了三种数据模型之间的差异。
概念模型 vs 逻辑模型 vs 数据模型:
ERD功能 | 概念 | 逻辑 | 物理 |
---|---|---|---|
实体(名称) | 是 | 是 | 是 |
关系 | 是 | 是 | 是 |
列 | 是 | 是 | |
列的类型 | 随意 | 是 | |
主键 | 是 | ||
外键 | 是 |
概念数据模型
概念性 ERD 表达了系统中该存在的业务对象以及它们之间的关系。建立概念模型,是为了通过识别所涉及的业务对象来呈现系统的宏观图像。概念数据模型定义了哪些实体存在,而非哪些表。例如,逻辑或物理数据模型中可能存在“多对多”表,但在概念数据模型下,它们只会表示为无基数的关系。
示例
逻辑数据模型
逻辑 ERD 是概念 ERD 的详细版本,通过明确定义每个实体中的列并引入操作和事务实体 (Transactional Entities)来让概念模型丰富起来。虽然逻辑数据模型仍流于高层次的设计(非为特定数据库系统而绘画),但如果会影响数据库的设计,在绘制逻辑数据模型时仍然可酌情调整。
逻辑数据模型示例
物理数据模型
物理 ERD 是数据库的实际设计蓝图。物理数据模型通过为每列指定类型 (Type),长度 (Length),可为空 (Nullable) 等来详细阐述逻辑数据模型。由于物理 ERD 表達了如何在特定的 DBMS中构造和关联数据,因此在設計時要考虑到实际的数据库系统的需要和局限,倒如确保 DBMS 支持某列类型,并在命名实体和列中避用某些保留字 (Reserved Words)。
如何绘制ER图
- 确保你清楚知道绘制 ERD 的目的。您是否试图呈现涉及业务对象定义的整体系统架构?或者你正在开发一个准备用于数据库创建的 ER 模型?您必须明了开发 ER 图的目的,方可使用合适的模型层次(概念/逻辑和物理)来迎合您所需 (请阅读概念,逻辑和物理数据模型部分了解更详细信息)
- 确保你清楚模型的范围。了解建模范围可以防止在设计中包含冗余实体和关系。
- 画出范围内的主要实体。
- 通过添加列来定义实体的属性。
- 仔细检查 ERD 并检查实体和列是否足以存储系统的数据。如果不是,请考虑添加其他实体和列。通常,您可以在此步骤中确定一些事务 (Transactional),操作 (Operational) 和事件 (Event) 实体。
- 考虑所有实体之间的关系,将它们联系起来,並寫上正確的基数(例如客户和订单之间的一对多关系)。如果有任何实体沒有被連接上,请不要担心,虽然這不常见,但它是合法的。
- 使用数据库规范化技术 (Database Normalization)重构实体,以减少冗余数据和提高数据完整性。例如,“制造商”的資訊可能最初存储在“产品”实体下,透過规范化过程,您可能会发“制造商”的记录不断重复,您便可将其拆分为单独的“制造商”实体,并使用外键將“产品”和“制造商”連接起來。