V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DarkEa
V2EX  ›  Java

敢问大佬们是如何处理多对多关系的

  •  1
     
  •   DarkEa · 2020-11-09 01:12:59 +08:00 via Android · 3918 次点击
    这是一个创建于 1468 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我有两张表,学生表和科目表,通过一张中间表关联。但是中间表除了两个外键外还有其他的字段,比如科目的成绩之类的。那么如何映射 Java 对象稍微好点呢。
    13 条回复    2020-11-09 11:37:38 +08:00
    laminux29
        1
    laminux29  
       2020-11-09 01:37:04 +08:00
    你需要的是成绩表吧?

    表字段结构:
    整数 ID,自增,唯一,非空。
    外键 学生 ID,非空。
    外键 科目 ID,非空。
    浮点 成绩,非空。

    表约束:学生 ID 、科目 ID 为联合唯一约束。

    根据这种表结构,随便 jpa 映射一下就好了。
    DarkEa
        2
    DarkEa  
    OP
       2020-11-09 09:10:46 +08:00 via Android
    @laminux29 #1 那中间表是要单独映射成对象么。如果我用 Mybatis 是直接映射关联的类(学生类和科目类)好还是直接映射外键 id
    ebingtel
        3
    ebingtel  
       2020-11-09 09:13:17 +08:00
    觉得所有的 orm 多对多映射都很麻烦……所以一直把关联表映射成对象 -- ; 完全从 sql 的逻辑去搞
    SWALLOWW
        4
    SWALLOWW  
       2020-11-09 09:26:26 +08:00
    这种啊,我一般设计好数据类型然后 ef codefirst 直接生成数据库
    kiracyan
        5
    kiracyan  
       2020-11-09 09:29:04 +08:00
    这都不能叫中间表
    securityCoding
        6
    securityCoding  
       2020-11-09 09:57:57 +08:00
    中间表很单纯的,不要夹杂业务属性
    DarkEa
        7
    DarkEa  
    OP
       2020-11-09 10:22:31 +08:00 via Android
    @securityCoding #6 但是如果只有比如一个多余字段,但是那个多余字段又是必要的再拆分一个表就有点多余了吧
    securityCoding
        8
    securityCoding  
       2020-11-09 10:26:52 +08:00
    @DarkEa 不多余 ,不同业务领域的属性不要揉在一起 ,合理的业务领域建模才能控制复杂度
    wysnylc
        9
    wysnylc  
       2020-11-09 10:49:00 +08:00
    拆成 1 对多,使用 in 二次查询+代码拼接
    不使用 join 避免多表查询,可提高性能和避免跨库事务
    DarkEa
        10
    DarkEa  
    OP
       2020-11-09 10:53:22 +08:00 via Android
    @securityCoding #8 那我要如何映射这几个表呢。学生对象中直接存放一个课程对象数组和成绩数组么。还是直接把他们拆成一个(学生+成绩)的对象和一个(课程+成绩)的对象
    DarkEa
        11
    DarkEa  
    OP
       2020-11-09 10:55:42 +08:00 via Android
    @wysnylc #9 用 in 二次查询是指先查出一个学生对应的所有课程 id 和成绩然后再通过 in 查询课程的 id 么
    leesaijyun
        12
    leesaijyun  
       2020-11-09 11:15:09 +08:00
    用户和角色就是一种多对多的关系,中间表就是用户 ID 、角色 ID, 一个用户可以同时是老师, 超级管理员, 财务什么的
    spbcu
        13
    spbcu  
       2020-11-09 11:37:38 +08:00
    这就不叫中间表了,这是成绩表,只是关联了另外两个表而已。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2616 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:35 · PVG 23:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.