• 请不要在回答技术问题时复制粘贴 AI 生成的内容
JackZhu0Amazing
V2EX  ›  程序员

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

  •  
  •   JackZhu0Amazing · Oct 18, 2021 · 3952 views
    This topic created in 1694 days ago, the information mentioned may be changed or developed.
    表 1 是作品表

    表 2 是类别表

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

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

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

    保存的时候很简单

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

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

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

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

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

    要么一了百了直接转图数据库
    EarthChild
        20
    EarthChild  
       Oct 19, 2021
    @corningsun #18 赞同,自己都说一对多了。一个作品多个类别。维护一个表多舒服
    asLw0P981N0M0TCC
        21
    asLw0P981N0M0TCC  
       Oct 19, 2021
    真巧 这个问题我问过 https://v2ex.xtra.eu.org/t/800291#reply18
    JackZhu0Amazing
        22
    JackZhu0Amazing  
    OP
       Oct 19, 2021
    @qwertyzzz 哈哈哈哈,握爪
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1193 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 17:49 · PVG 01:49 · LAX 10:49 · JFK 13:49
    ♥ Do have faith in what you're doing.