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

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

  •  
  •   JackZhu0Amazing · Oct 18, 2021 · 4579 views
    This topic created in 1848 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
    2i2Re2PLMaDnghL
    Oct 18, 2021
    1
    (难道不是多对多吗?
    先查,做 diff,再改
    KotlinAmai
    KotlinAmai
    Oct 18, 2021
    2
    1. diif 操作前和操作后的数据,也就是增加了哪些关系还有删除了哪些关系。
    或者
    2. 表 3 不使用自增 id,使用表 1 和表 2 的联合主键。全量删除,全量创建。
    akiakiseofficial
    akiakiseofficial
    Oct 18, 2021 via iPhone
    3
    歪门邪道但是实际用过的解决方案:

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

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

    doc.types = [type1, type2]

    doc.types = [type1]

    doc.save() 即可

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

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

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