关于一对多情况下修改问题

2021-10-18 10:21:18 +08:00
 JackZhu0Amazing
表 1 是作品表

表 2 是类别表

表 3 是 作品和类别的关系表

表 1 和表 2 是一对多的关系

也就是说一个作品可以有多个类别

保存的时候很简单

然后麻烦来了这个修改的时候怎么办呢

我以前用的方法是:修改之前把原来的关系全部删除然后再重新添加 这种方法简单但有一点 那个自增 id 会一直变,想得知诸位是否有更优雅且高效的解决方案?
2933 次点击
所在节点    程序员
22 条回复
2i2Re2PLMaDnghL
2021-10-18 10:28:10 +08:00
(难道不是多对多吗?
先查,做 diff,再改
actar
2021-10-18 10:28:59 +08:00
1. diif 操作前和操作后的数据,也就是增加了哪些关系还有删除了哪些关系。
或者
2. 表 3 不使用自增 id,使用表 1 和表 2 的联合主键。全量删除,全量创建。
xlui
2021-10-18 10:29:08 +08:00
歪门邪道但是实际用过的解决方案:

表三只存一条记录,表一的 id 、用逗号拼起来的表二的 id,这样更新的时候就只需要更新这一条记录,也不需要删除。

缺点是没办法联表查询了,不过一般也会禁止联表,所以可以接受。
kiracyan
2021-10-18 10:30:36 +08:00
表 3 的自增列无实际意义的啊 变了就变了
JackZhu0Amazing
2021-10-18 10:59:33 +08:00
@actar 嗯,1 操作看起来较为优雅,但是增加了复杂度,要查,然后依情况然后可能会有 insert 、delete 、update 等操作,相较我那种较为暴力的做法,大佬觉得 1 做法的优点有哪些
JackZhu0Amazing
2021-10-18 11:04:42 +08:00
@2i2Re2PLMaDnghL 目前处理手法就是全量删除,然后批量新增,😂想过先 differ 然后再改,但是觉得增加了复杂度,并且没有找到直观的优点
JackZhu0Amazing
2021-10-18 11:22:02 +08:00
@xlui 这种方法之前用过,好处就是更新起来方便,不好的地方就在于如你所说的不能联表查询,还有就是没办法 用表二的 id 查对应表一的 id,😂
a7082633
2021-10-18 11:26:17 +08:00
看情况的,如果你的自增 ID 没有其他业务用到就保持现在的做法,要不然就用 diff.
FrankFang128
2021-10-18 11:36:52 +08:00
只能一个一个修改
nekoneko
2021-10-18 14:40:07 +08:00
数据库是啥呀,postgres 可以考虑数组
sun019
2021-10-18 14:44:40 +08:00
现在挺好的
本来就是多对多关系。
shanghai1943
2021-10-18 14:46:31 +08:00
如果表 3 的 id 没在别处用到的话,就先全删除然后批量新增
elrrrrrrr
2021-10-18 14:52:36 +08:00
typeorm 的话用 cascade 配置就行

doc.types = [type1, type2]

doc.types = [type1]

doc.save() 即可

https://github.com/typeorm/typeorm/blob/master/docs/relations.md#cascades
ccppgo
2021-10-18 14:58:34 +08:00
表三甚至可以不要自增 ID
EscYezi
2021-10-18 15:46:48 +08:00
先删再添加应该是最简单有效的办法,除非原来的数据不能直接删
lanlanye
2021-10-18 17:05:01 +08:00
同楼上,表三其实不需要自增 ID,
如果非要有又不希望变,可以改用逻辑删除,先删再 upsert
fortunezhang
2021-10-18 17:14:20 +08:00
@xlui 哈哈,我也是这样用。搜索的时候只能用 like
corningsun
2021-10-18 17:48:02 +08:00
@xlui +1

表 3 删掉,表 1 增加一个字段存类别集合,可以直接逗号分隔,或者 Set<Integer> Json 序列化后存。
2i2Re2PLMaDnghL
2021-10-18 22:10:27 +08:00
@JackZhu0Amazing ORM 基本都能自动 diff,如果不能就去暴锤 ORM 作者。

要么一了百了直接转图数据库
EarthChild
2021-10-19 11:40:27 +08:00
@corningsun #18 赞同,自己都说一对多了。一个作品多个类别。维护一个表多舒服

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

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

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

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

© 2021 V2EX