• 根据E-R图设计数据库表


    在这里插入图片描述
    上图是一个E-R图,一共有三个实体:司机、车辆、车队。并且这几个实体之间互相具有一定的联系。
    我们首先把所有实体的表写出来。

    数据类型的选择请参考文章:https://blog.csdn.net/qq_61659383/article/details/124154332

    1. 设计实体表

    1.1 司机表

    字段名中文描述类型长度是否可以为空是否作为主键
    id司机编号int10
    name姓名varchar10
    telephone电话varchar20

    我们分析一下这个表怎么出来的:

    • 司机编号:类似这样的比如 学号、身份证号、图书编号等唯一ID,都可以直接以id命名,并且一般都是这张表的主键,而如果没有特殊需求,编号都是整数,所以我们选择 int 类型。int后面的长度根据需求填写,不离谱就行。
    • 姓名:首先取名字,姓名的英文翻译是 name。再看类型,名字肯定是一个字符串,我们选取字符串中用的最广的类型,varchar,然后给他取一个最大长度 10
    • 电话号:电话号英文翻译为telephone number,如果一定要起这个名字可以起telephone_number,但是有点长了,在取名不冲突的情况下(比如没有电话站telephone_station这样的字段出现),可以简化,所以我们最终取 telephone(甚至可以是 tel)。然后是选类型,我们都知道电话号码是纯数字,所以直接用数字可不可以,也是可以的,但是有溢出的风险(比如超过int能存储的最大值),而且我们存这个电话号码的目的也不是为了用于计算数字什么的,只是单纯的存一下。用字符串存也没有什么区别,这时候用字符串存最优,所以我们选择 varchar,长度留一个20(就和c语言里开数组一样,往大开一点点不是坏处)

    1.2 车辆表

    字段名中文描述类型长度是否可以为空是否作为主键
    id车牌照号varchar20
    factory厂家varchar255
    manufacture_date出厂日期datetime*

    我们分析一下这个表怎么出来的:

    • 车牌照号:同理,只不过车牌号还有字母,所以类型只能是字符串了,然后长度根据实际情况的基础上往大取一下就行。
    • 厂家:看到这个属性要警惕一下,因为E-R图可能不是你自己经手的,你不能保证E-R图是完全正确的。我们需要先去实体表里瞅一眼,有没有厂家这个实体,来判断这个属性算不算一个外键。好的,我们看过了,没有。看来这个仅仅就是一个属性而已,我们先去百度翻译找一个对应的 英文名:factory,ok就这个了。类型自然是字符串,varchar,长度取大一点。
    • 出厂日期:百度翻译“出厂日期”,manufacture_date,日期类型一律datetime。

    1.3 车队表

    字段名中文描述类型长度是否可以为空是否作为主键
    id车队号int20
    name车队名varchar255
    • 车队号:同理,直接取id,类型取int
    • 车队名:同理,取name,类型取varchar,长度长一点稍微

    2. 设计关系表

    观察E-R图,我们可以梳理下面的几条关系:

    • 车辆 <组成> 车队(1:n)
    • 车队 <聘用> 司机 ,并有 工资、聘期(1:n)
    • 司机 <使用> 车辆,并有 公里数、日期(n:m)

    2.1 车辆-车队 组成

    从E-R图上可以看出,车辆-车队是1:n关系。
    一对多是什么概念呢?意味着一辆车仅能参与一个车队,这样一对多才可行。
    我们可以直接在 车辆的表上加一个 外键“车队编号”,来解决这个问题。

    车辆表(加了外键)

    字段名中文描述类型长度是否可以为空是否作为主键
    id车牌照号varchar20
    factory厂家varchar255
    manufacture_date出厂日期datetime*
    team_id外键,关联车队表int20

    但是有些时候,加外键很不优雅,尤其是当关系特别多的时候(或者关系上还有属性),这时候我们也可以考虑建第三张表来解决。

    车辆-车队组成 表

    字段名中文描述类型长度是否可以为空是否作为主键
    car_id车牌照号varchar20
    team_id车队号id20

    这样,我们就不需要再新建外键来解决了。

    如果1:n关系上还附有其余的属性,那么还是选用第三张表比较好

    2.2 车辆-司机 使用表

    首先把关联两个表的外键放上去,然后再补充一下关系上的属性。

    字段名中文描述类型长度是否可以为空是否作为主键
    car_id车牌照号varchar20
    driver_id司机编号id20
    kilo_miles公里数float20
    date日期datetime*

    2.3 司机-车队 聘用表

    司机和车队是1:n,但是由于在聘用的关系上,它还增加了额外的属性(工资、聘期),所以我们采用建立第三张表的方式解决。

    字段名中文描述类型长度是否可以为空是否作为主键
    team_id车队号id20
    driver_id司机编号id20
    salary工资float20
    date聘期datetime*
  • 相关阅读:
    flutter课程(The Complete 2021 Flutter Development Bootcamp with Dart)学习总结
    万字逐行解析与实现Transformer,并进行德译英实战(二)
    第13章_瑞萨MCU零基础入门系列教程之Common SPI
    迷茫6连,这就是测试人毕业5年后的真实写照吗?
    【Hive SQL 每日一题】找出各个商品销售额的中位数
    基于Qlearning强化学习的倒立摆控制系统matlab仿真
    Java基础——native
    Prometheus配置监控ip、端口连通,get、post接口连通和状态码
    大数据错误
    2022年Redis最新面试题第1篇 - Redis基础知识
  • 原文地址:https://blog.csdn.net/okfang616/article/details/127036345