V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2020-12-28 14:47:51 +08:00 · 4868 次点击
    这是一个创建于 1205 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用途(需求)

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

    已有如下表

    • 学生表(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 条回复    2020-12-29 19:35:32 +08:00
    jones2000
        1
    jones2000  
       2020-12-28 14:54:51 +08:00
    老师表和学生表增加班级 ID 数组的 json 字段。这样 1 条记录就可以保存 1 个学生对应多个班级的信息了
    gesse
        2
    gesse  
       2020-12-28 15:05:40 +08:00
    “有考虑加个关系表 student_teacher 但想到每次加老师的,加学生到班级的时候,要插 n 条记录到关系表,不理想”

    你考虑的这个方案是最优方案
    且学生变动、老师变动,对数据库来说,不是频繁的数据变动事件。空间换时间,绝对划得来。
    akmisty
        3
    akmisty  
    OP
       2020-12-28 15:11:00 +08:00
    @jones2000 这方法还可以,但是在批量改动时 班级的学生、老师时,每个老师学生都要查出其所有班级,然后更新相应的字段
    cmdOptionKana
        4
    cmdOptionKana  
       2020-12-28 15:12:11 +08:00 via Android
    学生和老师一共就没几个人,完全不需要考虑性能问题,只考虑逻辑清晰易懂、不易出错就行。
    OaO
        5
    OaO  
       2020-12-28 15:16:13 +08:00   ❤️ 69
    对不起,我检讨,我不是带着学术讨论的目的点进这个标题的...( _ _)ノ
    leafre
        6
    leafre  
       2020-12-28 15:17:48 +08:00
    对不起,我想歪了
    akmisty
        7
    akmisty  
    OP
       2020-12-28 15:18:29 +08:00
    @OaO 哈哈,看了你的回复后,我自己也不忍直视了
    piecezzz
        8
    piecezzz  
       2020-12-28 15:18:35 +08:00
    对不起,我理解的关系不是这种关系
    yaocai321
        9
    yaocai321  
       2020-12-28 15:39:25 +08:00   ❤️ 2
    学生和老师竟然有多对多的关系, 太可怕了. 道德沦丧.
    cco
        10
    cco  
       2020-12-28 15:40:37 +08:00
    你这标题- -。我手误了。
    LYEHIZRF
        11
    LYEHIZRF  
       2020-12-28 15:40:45 +08:00
    看到标题想到 NLP 关系抽取🤦‍♀️ 被论文支配的恐惧
    Ranying
        12
    Ranying  
       2020-12-28 15:45:39 +08:00
    希望的点进来,失望的走出去。
    PeterYang1996
        13
    PeterYang1996  
       2020-12-28 15:51:23 +08:00
    失望
    reed2020
        14
    reed2020  
       2020-12-28 16:06:28 +08:00
    失望
    TimePPT
        15
    TimePPT  
       2020-12-28 16:12:01 +08:00
    试试图关系数据库
    wjfz
        16
    wjfz  
       2020-12-28 16:14:04 +08:00
    直接 INNER JOIN 现有两张关系表如何?
    jch
        17
    jch  
       2020-12-28 16:33:12 +08:00
    失望
    lyusantu
        18
    lyusantu  
       2020-12-28 16:49:11 +08:00
    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
        19
    kevinGraham  
       2020-12-28 16:53:50 +08:00
    对不起,这不是我想要看到的关系
    cking
        20
    cking  
       2020-12-28 16:58:47 +08:00
    对不起,我以为是师生恋
    daijialong
        21
    daijialong  
       2020-12-28 17:01:04 +08:00
    对不起,我以为是某国剧情点进来了
    XiaoxiaoPu
        22
    XiaoxiaoPu  
       2020-12-28 17:02:05 +08:00
    ```
    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
    ```
    dynastysea
        23
    dynastysea  
       2020-12-28 17:05:12 +08:00
    引入缓存
    motherfaka
        24
    motherfaka  
       2020-12-28 17:06:13 +08:00
    班级和老师也多对多的话,现有的方案就已经挺不错了,按道理一个班级的老师不会太多,可以考虑在班级字段里增加老师 id 的数组或者固定多个字段,降低业务复杂程度
    laminux29
        25
    laminux29  
       2020-12-28 17:14:12 +08:00
    这个问题本质是愿意为了节约时间来浪费空间,还是为了浪费空间来节约时间。。
    bluefalconjun
        26
    bluefalconjun  
       2020-12-28 17:17:41 +08:00
    希望的点进来,失望的走出去 +1
    fuxiuyin
        27
    fuxiuyin  
       2020-12-28 17:20:19 +08:00
    我怎么觉得这种一学期才会变一次的数据,程序起来的时候从数据库里读出来需要的数据,然后内存里面建方便用的数据结构之后查就行了,比如以教师 ID 为 key,学生 ID set 为 value 的 dict 。
    linux40
        28
    linux40  
       2020-12-28 17:22:48 +08:00 via Android   ❤️ 3
    节点本来就是 MySQL,怎么这么多废话的?
    wednesdayco
        29
    wednesdayco  
       2020-12-28 17:29:05 +08:00
    对不起,这不是我想要看到的关系
    cue
        30
    cue  
       2020-12-28 17:32:51 +08:00
    我特喵的都脑补了好几个番号了 你就给我看这个???
    iscook
        31
    iscook  
       2020-12-28 17:54:42 +08:00
    对不起,内容和我想的不一样
    52coder
        32
    52coder  
       2020-12-28 17:59:50 +08:00
    点进来看到内容有点失望,哈哈哈
    ZzFoo
        33
    ZzFoo  
       2020-12-28 18:38:50 +08:00
    什么关系?啊?你说什么关系?互为相反数啊!
    coderABC
        34
    coderABC  
       2020-12-28 20:45:43 +08:00 via Android
    这种问题不屑于回答,因为根本就不是我理解的关系
    writesome6
        35
    writesome6  
       2020-12-28 21:55:57 +08:00
    失望的内容
    user8341
        36
    user8341  
       2020-12-29 03:56:21 +08:00
    不晓得 MySQL 还有这功能!
    janssenkm
        37
    janssenkm  
       2020-12-29 07:53:00 +08:00 via iPhone
    这么点数据量,怎么画都不慢
    zqwcrystal
        38
    zqwcrystal  
       2020-12-29 11:44:37 +08:00
    如果纯用 sql 的话楼上就有解决办法,如果 sql 加代码逻辑实现的话可以分别查出来学生和老师对应的班级,然后两个数组取交集,为空则不存在关系,不为空则存在关系,即使学生或者老师表的数据再多,性能也不受影响
    zifangsky
        39
    zifangsky  
       2020-12-29 14:59:33 +08:00
    这种涉及到判断关系的问题,可以考虑试试用 并查集 这种数据结构来求解,每次有新的 学生 /老师 /班级 的关联关系时,就往并查集代表的数组中插入一条记录,删除关联关系时也做相应处理即可。最后,如果要判断某两者之间是否存在关系,也可以在线性时间复杂度内得到结果。
    xyjincan
        40
    xyjincan  
       2020-12-29 18:58:09 +08:00 via Android
    当初我是定义了一个课程表,
    APi85
        41
    APi85  
       2020-12-29 19:35:32 +08:00 via iPhone
    失望
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3634 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:57 · PVG 18:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.