根据E-R图设计数据库表
上图是一个E-R图,一共有三个实体:司机、车辆、车队。并且这几个实体之间互相具有一定的联系。
我们首先把所有实体的表写出来。
数据类型的选择请参考文章:https://blog.csdn.net/qq_61659383/article/details/124154332
1. 设计实体表
1.1 司机表
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 司机编号 | int | 10 | 否 | 是 |
name | 姓名 | varchar | 10 | 否 | 否 |
telephone | 电话 | varchar | 20 | 否 | 否 |
我们分析一下这个表怎么出来的:
- 司机编号:类似这样的比如 学号、身份证号、图书编号等唯一ID,都可以直接以id命名,并且一般都是这张表的主键,而如果没有特殊需求,编号都是整数,所以我们选择 int 类型。int后面的长度根据需求填写,不离谱就行。
- 姓名:首先取名字,姓名的英文翻译是 name。再看类型,名字肯定是一个字符串,我们选取字符串中用的最广的类型,varchar,然后给他取一个最大长度 10
- 电话号:电话号英文翻译为telephone number,如果一定要起这个名字可以起telephone_number,但是有点长了,在取名不冲突的情况下(比如没有电话站telephone_station这样的字段出现),可以简化,所以我们最终取 telephone(甚至可以是 tel)。然后是选类型,我们都知道电话号码是纯数字,所以直接用数字可不可以,也是可以的,但是有溢出的风险(比如超过int能存储的最大值),而且我们存这个电话号码的目的也不是为了用于计算数字什么的,只是单纯的存一下。用字符串存也没有什么区别,这时候用字符串存最优,所以我们选择 varchar,长度留一个20(就和c语言里开数组一样,往大开一点点不是坏处)
1.2 车辆表
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 车牌照号 | varchar | 20 | 否 | 是 |
factory | 厂家 | varchar | 255 | 否 | 否 |
manufacture_date | 出厂日期 | datetime | * | 否 | 否 |
我们分析一下这个表怎么出来的:
- 车牌照号:同理,只不过车牌号还有字母,所以类型只能是字符串了,然后长度根据实际情况的基础上往大取一下就行。
- 厂家:看到这个属性要警惕一下,因为E-R图可能不是你自己经手的,你不能保证E-R图是完全正确的。我们需要先去实体表里瞅一眼,有没有厂家这个实体,来判断这个属性算不算一个外键。好的,我们看过了,没有。看来这个仅仅就是一个属性而已,我们先去百度翻译找一个对应的 英文名:factory,ok就这个了。类型自然是字符串,varchar,长度取大一点。
- 出厂日期:百度翻译“出厂日期”,manufacture_date,日期类型一律datetime。
1.3 车队表
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 车队号 | int | 20 | 否 | 是 |
name | 车队名 | varchar | 255 | 否 | 否 |
- 车队号:同理,直接取id,类型取int
- 车队名:同理,取name,类型取varchar,长度长一点稍微
2. 设计关系表
观察E-R图,我们可以梳理下面的几条关系:
- 车辆 <组成> 车队(1:n)
- 车队 <聘用> 司机 ,并有 工资、聘期(1:n)
- 司机 <使用> 车辆,并有 公里数、日期(n:m)
2.1 车辆-车队 组成
从E-R图上可以看出,车辆-车队是1:n关系。
一对多是什么概念呢?意味着一辆车仅能参与一个车队,这样一对多才可行。
我们可以直接在 车辆的表上加一个 外键“车队编号”,来解决这个问题。
车辆表(加了外键)
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 车牌照号 | varchar | 20 | 否 | 是 |
factory | 厂家 | varchar | 255 | 否 | 否 |
manufacture_date | 出厂日期 | datetime | * | 否 | 否 |
team_id | 外键,关联车队表 | int | 20 | 否 | 否 |
但是有些时候,加外键很不优雅,尤其是当关系特别多的时候(或者关系上还有属性),这时候我们也可以考虑建第三张表来解决。
车辆-车队组成 表
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
car_id | 车牌照号 | varchar | 20 | 否 | 是 |
team_id | 车队号 | id | 20 | 否 | 是 |
这样,我们就不需要再新建外键来解决了。
如果1:n关系上还附有其余的属性,那么还是选用第三张表比较好
2.2 车辆-司机 使用表
首先把关联两个表的外键放上去,然后再补充一下关系上的属性。
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
car_id | 车牌照号 | varchar | 20 | 否 | 是 |
driver_id | 司机编号 | id | 20 | 否 | 是 |
kilo_miles | 公里数 | float | 20 | 否 | 是 |
date | 日期 | datetime | * | 否 | 是 |
2.3 司机-车队 聘用表
司机和车队是1:n,但是由于在聘用的关系上,它还增加了额外的属性(工资、聘期),所以我们采用建立第三张表的方式解决。
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
team_id | 车队号 | id | 20 | 否 | 是 |
driver_id | 司机编号 | id | 20 | 否 | 是 |
salary | 工资 | float | 20 | 否 | 是 |
date | 聘期 | datetime | * | 否 | 是 |
根据E-R图设计数据库表相关推荐
- 设计数据库表时,你真的会选数据类型吗
转载自 设计数据库表时,你真的会选数据类型吗 关系型数据库,是开发人员最常接触的持久化存储之一了,使用关系型数据库有很多好处,比如支持通过事务处理保持数据的一致性.数据更新的开销很小.可以进行Joi ...
- powerdesign java,PowerDesigner设计数据库表
1.说明 使用PowerDesigner设计数据库表, 然后将表设计导出为Word文档, 以及MySQL数据库对应的DDL刷库脚本. 2.创建模型 首先创建概念数据模型: File -> New ...
- 设计数据库表时数据类型的选择
设计数据库表时数据类型的选择 1. 整数类型 整数类型有:tinyint.smallint.mediumint.int.bigint,分别使用 8.16.24.32.64 位存储空间. 它们可以存储的 ...
- 数据库关系建模(ER图设计关系表)
目录 一.概述 二.基本概念 1. 关系(relation) 2. 列(column) 3. 行(row) 4. 关系表 VS 一般的表 5. 主码(主键primary key) 6. 实体完整性约束 ...
- 干掉 powerdesigner,设计数据库表用它就够了
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 点击" 程序员内点事 "关注,选择&q ...
- 一篇文章告诉你如何设计数据库表
0.三大范式及反范式 ◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列. ◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键:二是没有包含在主键中的 ...
- Access把每一天的数据累加_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...
- token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...
- oracle数据库纵表设计,oracle 数据库设计-数据库表设计
在数据库设计中,我的工作中经常会分析怎样商业逻辑中的表格如何设计.再设计表的关系之前 需要先了解关系型数据库特点 1关系型数据库,是指采用了关系模型来组织数据的数据库: 2.关系型数据库的最大特点就是 ...
最新文章
- iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment
- python守护进程_Python实现守护进程
- SAP UI5 初学者教程之十四 - 嵌入视图的使用方式试读版
- g4e基础篇#3 Git安装与配置
- 300GB*6 SCSI RAID5 LINUX服务器数据恢复手记
- FAQ宝典之Rancher Server
- 模型相关:SolidWorks创建Cube模型,在3DMax中给不同面添加不同颜色,导出自带纹理的FBX至Unity
- 音视频开发著作《Android音视频开发》终于发售了,先来一波签名送书福利!
- python ctp接口_GitHub - keli/ctp-python: 穿透式监管版本CTP接口的Python封装
- Java|二叉树基础详解
- 双舵轮AGV轨迹跟踪Pure Pursuit算法模型分析、python代码实现
- 软件工程-读《构建之法》读后感
- 三阶魔方7步还原法-一共只需记6个公式
- 云计算设计模式翻译(五):Compute Resource Consolidation Pattern
- 善网ESG报告(第十期)
- 7-2 判断是否含敏感词汇
- 玩转百度即用API(5)——空气质量指数查询
- 点击按钮返回数组 ages 中所有元素都大于输入框指定数值的元素和 $set()
- Unity3d Android SDK接入解析(三)接入Android Library的理解(爱贝云支付为例)
- Keil5中No Cortex-M4 SW Device Found 解决方法