当前位置: 首页 > news >正文

数据库设计:实体关系图

一个良好的设计对于数据库系统至关重要,它可以减少数据冗余,确保数据的一致性和完整性,同时使得数据库易于维护和扩展。

实体关系图(Entity-Relationship Diagram、ERD)是一种用于数据库设计的结构图,它描述了数据库中的实体以及它们之间的关系。从结构上来说,数据库的 ERD 主要包括实体、属性以及关系三个部分。

实体

实体代表了一种对象或者概念。例如,员工、部门和职位都可以被称为实体。实体包含一个或多个属性,实体在数据库中对应的就是关系表。下图是一个员工实体员工实体(employee)。

employee

属性

属性表示实体的某种特性,例如员工拥有姓名、性别、工资等属性。属性在数据库中对应的就是表中的字段,字段拥有一个指定的名称和数据类型。下图显示了员工实体的各种属性。

employee
其中,员工编号(emp_id)属性可用来唯一标识每一位员工,被称为主键(Primary Key)。主键可以是单个字段,也可以由多个字段组成。

关系

关系用于表示两个实体之间的联系,三种常见的关系类型包括一对一、一对多以及多对多的关系。

例如,一夫一妻制是一种典型的一对一的关系。一个员工只能属于一个部门,一个部门可以拥有多个员工,因此部门和员工之间是一对多的关系。一个学生可以选修多门课程,一门课程可以被多个学生选修,因此学生和课程之间是多对多的关系。

ERD 建模

数据库的 ERD 模型可以按照业务抽象层次分为三种类型:

  • 概念 ERD。概念数据模型用于描述系统中存在的业务对象以及它们之间的联系,一般由业务分析人员使用。在概念 ERD 中使用长方形表示实体,使用椭圆形表示属性,使用菱形表示联系。
  • 逻辑 ERD。逻辑数据模型用于对概念数据模型进一步的分解和细化,将其转换为关系模型(表和字段)。同时,逻辑 ERD 还会引入规范化过程,对关系模式进行优化。
  • 物理 ERD。物理数据模型是针对特定数据库的设计描述。物理 ERD 需要为每个字段指定数据类型、长度、可否为空等属性,同时为表增加主键、外键以及索引等。

许多常用的数据库软件都提供了 ERD 建模功能,例如 Visual Paradigm Community Edition、MySQL Workbench、Oracle SQL Developer、SQL Server Management Studio 等免费软件,以及 Toad Data Modeler、PowerDesigner、Navicat Data Modeler 等商业软件。

我们以 MySQL Workbench 为例简单介绍如何创建一个用于 MySQL 数据库的物理 ERD。首先点击软件主界面的“File”->“New Model”菜单,然后在打开的模型界面中点击“Add Diagram”按钮,新建一个 ERD 模型。

erd

接下来我们在 ERD 模型中通过拖曳加编辑的方式创建 department、job、employee 以及 job_history 4 个表,同时通过连线建立它们之间的关系。其中 department 和 employee 之间是一对多的关系,job 和 employee 之间也是一对多的关系,job_history 则和其他 3 个表之间存在外键关联。

最终,我们创建的 ERD 如下图所示。

erd

最后,我们可以点击“File”->“Export”菜单,将 ERD 模型导出为 SQL 脚本或者图片,也可以点击“Database”->“Forward Engineer”菜单,连接 MySQL 数据库来创建物理表和索引。

另外,我们还可以点击“Database”->“Reverse Engineer”菜单,从已有的 MySQL 数据库中反向生成物理 ERD 模型。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 速盾:怎么查询cdn真实ip?
  • Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919)
  • spring自动配置
  • 智能台灯系统之PWM调光的优缺点
  • 销量逆袭!敦煌店铺如何靠自养号测评轻松引爆市场?
  • ROS for LabVIEW:实现LabVIEW与ROS的无缝集成
  • 探索 Ollama: 你的本地 AI 助手
  • Unreal Engine游戏引擎小白入门指南
  • 构建坚不可摧的Web安全防线:深入剖析二阶注入与全面防御策略
  • 基础—SQL—DML(数据操作语言)插入数据
  • ffmpeg在特定时间点插入素材
  • SpringBoot整合Kafka的快速使用教程
  • 爬虫学习--17.反爬斗争 selenium(2)
  • 机器人控制系列教程之D-H参数建模法
  • golang语言的gofly快速开发框架如何设置多样的主题说明
  • 3.7、@ResponseBody 和 @RestController
  • CentOS7 安装JDK
  • Docker入门(二) - Dockerfile
  • gf框架之分页模块(五) - 自定义分页
  • Gradle 5.0 正式版发布
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 多线程编程之:notify 和 wait 用法
  • JWT究竟是什么呢?
  • Laravel Telescope:优雅的应用调试工具
  • RxJS: 简单入门
  • SpiderData 2019年2月23日 DApp数据排行榜
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Xmanager 远程桌面 CentOS 7
  • 删除表内多余的重复数据
  • 问题之ssh中Host key verification failed的解决
  • 优化 Vue 项目编译文件大小
  • 原生Ajax
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • $().each和$.each的区别
  • (3)STL算法之搜索
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (二)JAVA使用POI操作excel
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (十八)SpringBoot之发送QQ邮件
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **PHP分步表单提交思路(分页表单提交)
  • .apk文件,IIS不支持下载解决
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core中如何集成RabbitMQ
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NetCore 如何动态路由
  • .Net环境下的缓存技术介绍
  • .php文件都打不开,打不开php文件怎么办
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理