1

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

 2 years ago
source link: https://www.v2ex.com/t/808469
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
关于一对多情况下修改问题 - V2EX

V2EX  ›  程序员

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

  JackZhu0Amazing · 9 小时 3 分钟前 · 935 次点击
表 1 是作品表

表 2 是类别表

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

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

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

保存的时候很简单

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

我以前用的方法是:修改之前把原来的关系全部删除然后再重新添加 这种方法简单但有一点 那个自增 id 会一直变,想得知诸位是否有更优雅且高效的解决方案?

第 1 条附言  ·  8 小时 6 分钟前

表 1 和表 2 是多对多关系,在此更正一下,😂
18 条回复    2021-10-18 17:48:02 +08:00

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL   8 小时 56 分钟前

(难道不是多对多吗?
先查,做 diff,再改

actar

actar   8 小时 56 分钟前

1. diif 操作前和操作后的数据,也就是增加了哪些关系还有删除了哪些关系。
或者
2. 表 3 不使用自增 id,使用表 1 和表 2 的联合主键。全量删除,全量创建。

xlui

xlui   8 小时 55 分钟前 via iPhone

歪门邪道但是实际用过的解决方案:

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

缺点是没办法联表查询了,不过一般也会禁止联表,所以可以接受。

kiracyan

kiracyan   8 小时 54 分钟前   ❤️ 1

表 3 的自增列无实际意义的啊 变了就变了

JackZhu0Amazing

JackZhu0Amazing   8 小时 25 分钟前

@actar 嗯,1 操作看起来较为优雅,但是增加了复杂度,要查,然后依情况然后可能会有 insert 、delete 、update 等操作,相较我那种较为暴力的做法,大佬觉得 1 做法的优点有哪些

JackZhu0Amazing

JackZhu0Amazing   8 小时 20 分钟前

@2i2Re2PLMaDnghL 目前处理手法就是全量删除,然后批量新增,😂想过先 differ 然后再改,但是觉得增加了复杂度,并且没有找到直观的优点

JackZhu0Amazing

JackZhu0Amazing   8 小时 3 分钟前

@xlui 这种方法之前用过,好处就是更新起来方便,不好的地方就在于如你所说的不能联表查询,还有就是没办法 用表二的 id 查对应表一的 id,😂

a7082633

a7082633   7 小时 58 分钟前

看情况的,如果你的自增 ID 没有其他业务用到就保持现在的做法,要不然就用 diff.

FrankFang128

FrankFang128   7 小时 48 分钟前

只能一个一个修改

nekoneko

nekoneko   4 小时 44 分钟前

数据库是啥呀,postgres 可以考虑数组

sun019

sun019   4 小时 40 分钟前

现在挺好的
本来就是多对多关系。

shanghai1943

shanghai1943   4 小时 38 分钟前

如果表 3 的 id 没在别处用到的话,就先全删除然后批量新增

elrrrrrrr

elrrrrrrr   4 小时 32 分钟前

typeorm 的话用 cascade 配置就行

doc.types = [type1, type2]

doc.types = [type1]

doc.save() 即可

https://github.com/typeorm/typeorm/blob/master/docs/relations.md#cascades

ccppgo

ccppgo   4 小时 26 分钟前

表三甚至可以不要自增 ID

EscYezi

EscYezi   3 小时 38 分钟前 via iPhone

先删再添加应该是最简单有效的办法,除非原来的数据不能直接删

lanlanye

lanlanye   2 小时 20 分钟前

同楼上,表三其实不需要自增 ID,
如果非要有又不希望变,可以改用逻辑删除,先删再 upsert

fortunezhang

fortunezhang   2 小时 10 分钟前

@xlui 哈哈,我也是这样用。搜索的时候只能用 like

corningsun

corningsun   1 小时 37 分钟前

@xlui +1

表 3 删掉,表 1 增加一个字段存类别集合,可以直接逗号分隔,或者 Set<Integer> Json 序列化后存。

关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2679 人在线   最高记录 5497   ·  

创意工作者们的社区

World is powered by solitude

VERSION: 3.9.8.5 · 21ms · UTC 11:25 · PVG 19:25 · LAX 04:25 · JFK 07:25
♥ Do have faith in what you're doing.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK