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

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

  •  
  •   JackZhu0Amazing · 2021-10-18 10:21:18 +08:00 · 2620 次点击
    这是一个创建于 893 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表 1 是作品表

    表 2 是类别表

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

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

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

    保存的时候很简单

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

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

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

    缺点是没办法联表查询了,不过一般也会禁止联表,所以可以接受。
    kiracyan
        4
    kiracyan  
       2021-10-18 10:30:36 +08:00   ❤️ 1
    表 3 的自增列无实际意义的啊 变了就变了
    JackZhu0Amazing
        5
    JackZhu0Amazing  
    OP
       2021-10-18 10:59:33 +08:00
    @actar 嗯,1 操作看起来较为优雅,但是增加了复杂度,要查,然后依情况然后可能会有 insert 、delete 、update 等操作,相较我那种较为暴力的做法,大佬觉得 1 做法的优点有哪些
    JackZhu0Amazing
        6
    JackZhu0Amazing  
    OP
       2021-10-18 11:04:42 +08:00
    @2i2Re2PLMaDnghL 目前处理手法就是全量删除,然后批量新增,😂想过先 differ 然后再改,但是觉得增加了复杂度,并且没有找到直观的优点
    JackZhu0Amazing
        7
    JackZhu0Amazing  
    OP
       2021-10-18 11:22:02 +08:00
    @xlui 这种方法之前用过,好处就是更新起来方便,不好的地方就在于如你所说的不能联表查询,还有就是没办法 用表二的 id 查对应表一的 id,😂
    a7082633
        8
    a7082633  
       2021-10-18 11:26:17 +08:00
    看情况的,如果你的自增 ID 没有其他业务用到就保持现在的做法,要不然就用 diff.
    FrankFang128
        9
    FrankFang128  
       2021-10-18 11:36:52 +08:00
    只能一个一个修改
    nekoneko
        10
    nekoneko  
       2021-10-18 14:40:07 +08:00
    数据库是啥呀,postgres 可以考虑数组
    sun019
        11
    sun019  
       2021-10-18 14:44:40 +08:00
    现在挺好的
    本来就是多对多关系。
    shanghai1943
        12
    shanghai1943  
       2021-10-18 14:46:31 +08:00
    如果表 3 的 id 没在别处用到的话,就先全删除然后批量新增
    elrrrrrrr
        13
    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
        14
    ccppgo  
       2021-10-18 14:58:34 +08:00
    表三甚至可以不要自增 ID
    EscYezi
        15
    EscYezi  
       2021-10-18 15:46:48 +08:00 via iPhone
    先删再添加应该是最简单有效的办法,除非原来的数据不能直接删
    lanlanye
        16
    lanlanye  
       2021-10-18 17:05:01 +08:00
    同楼上,表三其实不需要自增 ID,
    如果非要有又不希望变,可以改用逻辑删除,先删再 upsert
    fortunezhang
        17
    fortunezhang  
       2021-10-18 17:14:20 +08:00
    @xlui 哈哈,我也是这样用。搜索的时候只能用 like
    corningsun
        18
    corningsun  
       2021-10-18 17:48:02 +08:00
    @xlui +1

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

    要么一了百了直接转图数据库
    EarthChild
        20
    EarthChild  
       2021-10-19 11:40:27 +08:00
    @corningsun #18 赞同,自己都说一对多了。一个作品多个类别。维护一个表多舒服
    qwertyzzz
        21
    qwertyzzz  
       2021-10-19 15:32:23 +08:00
    真巧 这个问题我问过 https://www.v2ex.com/t/800291#reply18
    JackZhu0Amazing
        22
    JackZhu0Amazing  
    OP
       2021-10-19 16:09:52 +08:00
    @qwertyzzz 哈哈哈哈,握爪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3591 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:42 · PVG 12:42 · LAX 21:42 · JFK 00:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.