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

2020-11-09 01:12:59 +08:00
 DarkEa
比如我有两张表,学生表和科目表,通过一张中间表关联。但是中间表除了两个外键外还有其他的字段,比如科目的成绩之类的。那么如何映射 Java 对象稍微好点呢。
3959 次点击
所在节点    Java
13 条回复
laminux29
2020-11-09 01:37:04 +08:00
你需要的是成绩表吧?

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

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

根据这种表结构,随便 jpa 映射一下就好了。
DarkEa
2020-11-09 09:10:46 +08:00
@laminux29 #1 那中间表是要单独映射成对象么。如果我用 Mybatis 是直接映射关联的类(学生类和科目类)好还是直接映射外键 id
ebingtel
2020-11-09 09:13:17 +08:00
觉得所有的 orm 多对多映射都很麻烦……所以一直把关联表映射成对象 -- ; 完全从 sql 的逻辑去搞
SWALLOWW
2020-11-09 09:26:26 +08:00
这种啊,我一般设计好数据类型然后 ef codefirst 直接生成数据库
kiracyan
2020-11-09 09:29:04 +08:00
这都不能叫中间表
securityCoding
2020-11-09 09:57:57 +08:00
中间表很单纯的,不要夹杂业务属性
DarkEa
2020-11-09 10:22:31 +08:00
@securityCoding #6 但是如果只有比如一个多余字段,但是那个多余字段又是必要的再拆分一个表就有点多余了吧
securityCoding
2020-11-09 10:26:52 +08:00
@DarkEa 不多余 ,不同业务领域的属性不要揉在一起 ,合理的业务领域建模才能控制复杂度
wysnylc
2020-11-09 10:49:00 +08:00
拆成 1 对多,使用 in 二次查询+代码拼接
不使用 join 避免多表查询,可提高性能和避免跨库事务
DarkEa
2020-11-09 10:53:22 +08:00
@securityCoding #8 那我要如何映射这几个表呢。学生对象中直接存放一个课程对象数组和成绩数组么。还是直接把他们拆成一个(学生+成绩)的对象和一个(课程+成绩)的对象
DarkEa
2020-11-09 10:55:42 +08:00
@wysnylc #9 用 in 二次查询是指先查出一个学生对应的所有课程 id 和成绩然后再通过 in 查询课程的 id 么
leesaijyun
2020-11-09 11:15:09 +08:00
用户和角色就是一种多对多的关系,中间表就是用户 ID 、角色 ID, 一个用户可以同时是老师, 超级管理员, 财务什么的
spbcu
2020-11-09 11:37:38 +08:00
这就不叫中间表了,这是成绩表,只是关联了另外两个表而已。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX