MySQL学习第三弹。

MySQL-3-数据库的设计

1. 表之间的关系

1. 分类

  1. 一对一
    • 人和身份证
    • 一个人只有一个身份证,一个身份证对应一个人
  2. 一对多
    • 部门和员工
    • 一个部门有多个员工,而多个员工对应一个部门
  3. 多对多
    • 学生和课程
    • 一个学生可以选多门课程,一个课程可以被多个学生选择

2. 实现

  1. 一对多:例如,部门和员工

    实现方式:在【多】的一方建立外键,指向【一】的一方的主键。

    image-20210115121413016

  2. 多对多:例如,学生和课程

    实现方式:借助第三张中间表。表中至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

    NToN

  3. 一对一:人和身份证

    实现方式:在任意一方添加唯一约束的主键,指向另外一方。

    注意:实际中很少这种情况,既然存在一对一,为何不把它们放在同一张表中呢?

    oneToone

3. 旅游线路的分析

  • 旅游线路表、线路分类表、用户表

    线路分类下有很多条旅游线路,一条旅游线路可以被多个用户收藏,一个用户可以收藏多条线路。

  • 分析:

    traveldemo

  • 代码实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    -- 旅游分类表
    CREATE TABLE tab_categroy(
    cid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
    cname VARCHAR(100) NOT NULL UNIQUE -- cname 非空,唯一
    );
    -- 旅游线路表
    CREATE TABLE tab_route(
    rid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
    rname VARCHAR(100) NOT NULL UNIQUE, -- rname 非空,唯一
    price DOUBLE,
    rdate DATE,
    cid INT, -- 外键
    -- 将cid与tab_categroy中的cid关联
    FOREIGN KEY(cid) REFERENCES tab_categroy(cid)
    );
    -- 用户表
    CREATE TABLE tab_user(
    uid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
    username VARCHAR(100) UNIQUE NOT NULL,
    PASSWORD VARCHAR(30) NOT NULL,
    NAME VARCHAR(100),
    birthday DATE,
    sex CHAR(1) DEFAULT '男', -- 性别,默认男
    telephone VARCHAR(11),
    email VARCHAR(100)
    );
    -- 收藏(连接用户与线路)
    CREATE TABLE tab_favorite(
    rid INT,
    DATE DATETIME, -- 关联时间
    uid INT,
    PRIMARY KEY(rid,uid),
    FOREIGN KEY(rid) REFERENCES tab_route(rid), -- rid关联tab_route中的rid
    FOREIGN KEY(uid) REFERENCES tab_user(uid) -- uid关联tab_user中的uid
    );

  • SQLyog架构设计器显示

    demo

2. 范式(略)

评论