上图是一个E-R图,一共有三个实体:司机、车辆、车队。并且这几个实体之间互相具有一定的联系。
我们首先把所有实体的表写出来。
数据类型的选择请参考文章:https://blog.csdn.net/qq_61659383/article/details/124154332
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 司机编号 | int | 10 | 否 | 是 |
name | 姓名 | varchar | 10 | 否 | 否 |
telephone | 电话 | varchar | 20 | 否 | 否 |
我们分析一下这个表怎么出来的:
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 车牌照号 | varchar | 20 | 否 | 是 |
factory | 厂家 | varchar | 255 | 否 | 否 |
manufacture_date | 出厂日期 | datetime | * | 否 | 否 |
我们分析一下这个表怎么出来的:
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
id | 车队号 | int | 20 | 否 | 是 |
name | 车队名 | varchar | 255 | 否 | 否 |
观察E-R图,我们可以梳理下面的几条关系:
从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关系上还附有其余的属性,那么还是选用第三张表比较好
首先把关联两个表的外键放上去,然后再补充一下关系上的属性。
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
car_id | 车牌照号 | varchar | 20 | 否 | 是 |
driver_id | 司机编号 | id | 20 | 否 | 是 |
kilo_miles | 公里数 | float | 20 | 否 | 是 |
date | 日期 | datetime | * | 否 | 是 |
司机和车队是1:n,但是由于在聘用的关系上,它还增加了额外的属性(工资、聘期),所以我们采用建立第三张表的方式解决。
字段名 | 中文描述 | 类型 | 长度 | 是否可以为空 | 是否作为主键 |
---|---|---|---|---|---|
team_id | 车队号 | id | 20 | 否 | 是 |
driver_id | 司机编号 | id | 20 | 否 | 是 |
salary | 工资 | float | 20 | 否 | 是 |
date | 聘期 | datetime | * | 否 | 是 |