• 数据库(六):多表关系


    进击のpython

    *****

    数据库——多表关系


    多表问题其实可以把它变成两个表之间的关系

    就像上一节我们提到的外键,就是两个表之间的关系

    所以对于多表之间的关系,我们可以化繁为简讨论两个表之间的关系

    表与表之间的关系就好像数学函数的y和x的关系,也分为三种:

    一对一,多对一,多对多~


    多对一

    怎么说呢?其实上一节我们做的那个外键表就是一个多对一模式

    怎么叫做多对一呢?有个十分简单的的方法来解决这个问题

    还是拿上一个举例子~ staff员工表和department职位表

    盘腿坐下思考两个问题:

    小张能不能既属于技术部,又属于财务部?不能!

    技术部可不可以有小刘和小李两个人?能!

    这样一面行,另一面不行,就是多对一

    能的 就是被关联的表,所以 部门就是被关联的!

    再来个例子:出版社 书

    盘腿坐下思考两个问题:

    书能不能被多个出版社出版?不能!

    出版社能不能有多本书?能!

    那知道了吧,这就是多对一

    所以 书 就应该用 forgen... ...,出版社就是被关联的表~

    (自己试着把这个敲一遍)


    多对多

    多对多就更好玩了,书 作者

    我们继续盘腿思考:

    书能不能有多个作者?能!

    一个作者能不能写多本书?能!

    这就相当于什么?两边都是多对一,双向的多对一,所以就是多对多

    但是怎么建呢???按照这个逻辑,这两个表彼此应该都有外键

    而前面学习到的是有外键要先建被关联的表,A的外键是B,B的外键是A,好家伙~死循环了

    那针对这个问题聪明的人想出了一种解决办法:

    这么僵持指定是没有解决办法,于是想到,我们可以把这种外键的关联信息,存到另一个表里

    这样,这两个表在建立的时候,就不会因为没有外键而建不出来了

    author:

    id author
    1 tom
    2 alex
    3 jerry
    4 john
    5 boss
    6 alise

    book:

    id book
    1 Red_Ball
    2 Sun_raise
    3 Green_tree

    author2book:

    author_id book_id
    1 1
    2 3
    3 2
    4 1
    5 3
    6 1
    mysql> select * from book;
    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | Red_Ball   |
    |  2 | Sun_raise  |
    |  3 | Green_tree |
    +----+------------+
    3 rows in set (0.00 sec)
    
    mysql> select * from author;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | tom   |
    |  2 | alex  |
    |  3 | jerry |
    |  4 | john  |
    |  5 | boss  |
    |  6 | alise |
    +----+-------+
    6 rows in set (0.00 sec)
    
    

    然后就开始建第三个表:

    mysql> create table author2book(
        ->
        -> id int not null unique auto_increment,
        -> author_id int not null,
        -> book_id int not null,
        ->
        -> foreign key(author_id) references author(id)
        -> on delete cascade
        -> on update cascade,
        ->
        -> foreign key(book_id) references book(id)
        -> on delete cascade
        -> on update cascade,
        ->
        -> primary key(author_id,book_id)
        -> );
    Query OK, 0 rows affected (1.64 sec)
    
    
    mysql> select * from author2book;
    +----+-----------+---------+
    | id | author_id | book_id |
    +----+-----------+---------+
    |  1 |         1 |       1 |
    |  2 |         2 |       3 |
    |  3 |         3 |       2 |
    |  4 |         4 |       1 |
    |  5 |         5 |       3 |
    |  6 |         6 |       1 |
    +----+-----------+---------+
    6 rows in set (0.00 sec)
    
    

    这就算是建好了联系


    一对一

    男女之间总是要结婚的,那此时就会出现一对一的情况

    一个名单是男,一个名单是女,那这两个一定是一一对应的才是合理的,那这就是,一对一的情况

    外键通过前面的你也发现了,forgen这个创造外键的方式创造的是多对一的方式

    那如何才能让他一对一呢?其实问题就在于,添加的键有重复才会让其变成多对一的情况

    那变成一对一就是让数据部从夫,数据不重复用的是什么约束?unique!

    我们只需要在建立外键的时候,将外键的属性约束成唯一就行了

    (这个一对一,建议你自己操作,师傅领进门,修行在个人!)


    *****
    *****
  • 相关阅读:
    uboot中打开 debug调试信息的方法
    如何知道外围器件的器件地址PHY_ADDR
    附录:ARM 手册 词汇表
    ARM协处理器CP15寄存器详解
    浅析ARM协处理器CP15寄存器有关指令:MCRMRC
    uboot-的start.S详细注解及分析
    Shell中的算数运算
    Linux下的expect
    Linux 常用工具sysstat之iostat
    Linux的top命令
  • 原文地址:https://www.cnblogs.com/jevious/p/11446904.html
Copyright © 2020-2023  润新知