敢问大佬们是如何处理多对多关系的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DarkEa
V2EX    Java

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

  •  1
     
  •   DarkEa 2020-11-09 01:12:59 +08:00 via Android 4367 次点击
    这是一个创建于 1802 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我有两张表,学生表和科目表,通过一张中间表关联。但是中间表除了两个外键外还有其他的字段,比如科目的成绩之类的。那么如何映射 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     Solana     921 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 20:08 PVG 04:08 LAX 13:08 JFK 16:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86