› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
akmisty
V2EX  ›  MySQL

请教大佬们,关于判断一个学生和一个老师有无关系的问题

  •  
  •   akmisty · Dec 28, 2020 · 6689 views
    This topic created in 2142 days ago, the information mentioned may be changed or developed.

    用途(需求)

    因老师只能处理自己的学生,所以需要检查关系

    已有如下表

    • 学生表(student):id, name, ...
    • 老师表(teacher):id, name, ...
    • 班级表(class): id, name, ...
    • 班级和学生的多对多关系表(class_student):id, class_id, student_id, ...
    • 班级和老师的多对多关系表(class_teacher):id, class_id, teacher_id, ...

    关系介绍

    • 1 个学生可以在多个班级
    • 1 个老师也可以在多个班级

    输入

    输入是 student_id 和 teacher_id

    目前的方案:

    1. 先通过 student_id 去 class_student 查得学生所在的所有班级 ID class_ids,
    2. 再用 class_ids 和 teacher_id 去 class_teacher 验证

    请问有没有更好的方案呢?

    有考虑加个关系表 student_teacher 但想到每次加老师的,加学生到班级的时候,要插 n 条记录到关系表,不理想

    41 replies  •  2020-12-29 19:35:32 +08:00
    jones2000
    jones2000
    Dec 28, 2020
    1
    老师表和学生表增加班级 ID 数组的 json 字段。这样 1 条记录就可以保存 1 个学生对应多个班级的信息了
    gesse
    gesse
    Dec 28, 2020
    2
    “有考虑加个关系表 student_teacher 但想到每次加老师的,加学生到班级的时候,要插 n 条记录到关系表,不理想”

    你考虑的这个方案是最优方案
    且学生变动、老师变动,对数据库来说,不是频繁的数据变动事件。空间换时间,绝对划得来。
    akmisty
    akmisty
    OP
    Dec 28, 2020
    3
    @jones2000 这方法还可以,但是在批量改动时 班级的学生、老师时,每个老师学生都要查出其所有班级,然后更新相应的字段
    QingXuJiaZhi
    QingXuJiaZhi
    Dec 28, 2020 via Android
    4
    学生和老师一共就没几个人,完全不需要考虑性能问题,只考虑逻辑清晰易懂、不易出错就行。
    OaO
    OaO
    Dec 28, 2020❤️69
    5
    对不起,我检讨,我不是带着学术讨论的目的点进这个标题的...( _ _)ノ
    leafre
    leafre
    Dec 28, 2020
    6
    对不起,我想歪了
    akmisty
    akmisty
    OP
    Dec 28, 2020
    7
    @OaO 哈哈,看了你的回复后,我自己也不忍直视了
    piecezzz
    piecezzz
    Dec 28, 2020
    8
    对不起,我理解的关系不是这种关系
    ClaudeCode
    ClaudeCode
    Dec 28, 2020❤️2
    9
    学生和老师竟然有多对多的关系, 太可怕了. 道德沦丧.
    cco
    cco
    Dec 28, 2020
    10
    你这标题- -。我手误了。
    LYEHIZRF
    LYEHIZRF
    Dec 28, 2020
    11
    看到标题想到 NLP 关系抽取🤦‍♀️ 被论文支配的恐惧
    Ranying
    Ranying
    Dec 28, 2020
    12
    希望的点进来,失望的走出去。
    PeterYang1996
    PeterYang1996
    Dec 28, 2020
    13
    失望
    reed2020
    reed2020
    Dec 28, 2020
    14
    失望
    TimePPT
    TimePPT
    Dec 28, 2020
    15
    试试图关系数据库
    wjfz
    wjfz
    Dec 28, 2020
    16
    直接 INNER JOIN 现有两张关系表如何?
    jch
    jch
    Dec 28, 2020
    17
    失望
    lyusantu
    lyusantu
    Dec 28, 2020
    18
    SELECT count(1)
    FROM class_teacher
    WHERE teacher_id in(
    SELECT class_id FROM class_student WHERE student_id = #{studentId}
    )
    AND teacher_id = #{teacherId}

    判断查询结果是否 > 0 即可知道是否有无关系?
    kevinGraham
    kevinGraham
    Dec 28, 2020
    19
    对不起,这不是我想要看到的关系
    cking
    cking
    Dec 28, 2020
    20
    对不起,我以为是师生恋
    daijialong
    daijialong
    Dec 28, 2020
    21
    对不起,我以为是某国剧情点进来了
    XiaoxiaoPu
    XiaoxiaoPu
    Dec 28, 2020
    22
    ```
    select 1
    from `class_student`
    inner join `class_teacher` on `class_student`.`class_id` = `class_teacher`.`class_id`
    where `class_student`.`student_id` = #{student_id}
    and `class_teacher`.`teacher_id` = #{teacher_id}
    limit 1
    ```
    digitv
    digitv
    Dec 28, 2020
    23
    引入缓存
    motherfaka
    motherfaka
    Dec 28, 2020
    24
    班级和老师也多对多的话,现有的方案就已经挺不错了,按道理一个班级的老师不会太多,可以考虑在班级字段里增加老师 id 的数组或者固定多个字段,降低业务复杂程度
    laminux29
    laminux29
    Dec 28, 2020
    25
    这个问题本质是愿意为了节约时间来浪费空间,还是为了浪费空间来节约时间。。
    bluefalconjun
    bluefalconjun
    Dec 28, 2020
    26
    希望的点进来,失望的走出去 +1
    fuxiuyin
    fuxiuyin
    Dec 28, 2020
    27
    我怎么觉得这种一学期才会变一次的数据,程序起来的时候从数据库里读出来需要的数据,然后内存里面建方便用的数据结构之后查就行了,比如以教师 ID 为 key,学生 ID set 为 value 的 dict 。
    linux40
    linux40
    Dec 28, 2020 via Android❤️3
    28
    节点本来就是 MySQL,怎么这么多废话的?
    wednesdayco
    wednesdayco
    Dec 28, 2020
    29
    对不起,这不是我想要看到的关系
    cue
    cue
    Dec 28, 2020
    30
    我特喵的都脑补了好几个番号了 你就给我看这个???
    iscook
    iscook
    Dec 28, 2020
    31
    对不起,内容和我想的不一样
    52coder
    52coder
    Dec 28, 2020
    32
    点进来看到内容有点失望,哈哈哈
    ZzFoo
    ZzFoo
    Dec 28, 2020
    33
    什么关系?啊?你说什么关系?互为相反数啊!
    coderABC
    coderABC
    Dec 28, 2020 via Android
    34
    这种问题不屑于回答,因为根本就不是我理解的关系
    writesome6
    writesome6
    Dec 28, 2020
    35
    失望的内容
    9LCRwvU14033RHJo
    9LCRwvU14033RHJo
    Dec 29, 2020
    36
    不晓得 MySQL 还有这功能!
    janssenkm
    janssenkm
    Dec 29, 2020 via iPhone
    37
    这么点数据量,怎么画都不慢
    zqwcrystal
    zqwcrystal
    Dec 29, 2020
    38
    如果纯用 sql 的话楼上就有解决办法,如果 sql 加代码逻辑实现的话可以分别查出来学生和老师对应的班级,然后两个数组取交集,为空则不存在关系,不为空则存在关系,即使学生或者老师表的数据再多,性能也不受影响
    zifangsky
    zifangsky
    Dec 29, 2020
    39
    这种涉及到判断关系的问题,可以考虑试试用 并查集 这种数据结构来求解,每次有新的 学生 /老师 /班级 的关联关系时,就往并查集代表的数组中插入一条记录,删除关联关系时也做相应处理即可。最后,如果要判断某两者之间是否存在关系,也可以在线性时间复杂度内得到结果。
    xyjincan
    xyjincan
    Dec 29, 2020 via Android
    40
    当初我是定义了一个课程表,
    APi85
    APi85
    Dec 29, 2020 via iPhone
    41
    失望
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1984 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    ♥ Do have faith in what you're doing.