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

Java 后端,关于修改名称对应的下级所有部门都要修改全称

  •  
  •   Lyv5 · 184 天前 · 2845 次点击
    这是一个创建于 184 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大佬好,给大佬倒卡布奇诺,如下

    例子:
    数据库内容
    index deptname deptfullname upstreamAuthorities
    1 开发中心 开发中心 0
    2 java 开发中心-java 1
    3 Linux 开发中心-java-Linux 2

    用的是 springboot
    现在修改 java 名字为 Python 相应的 deptfullname 和 Linux 的 deptfullname 也要修改 只要是被修改 java 的下级部门全称包含 java 的也要修改 当然部门层级以上只是一小部分

    现在只想到二级部门用分割的办法 感觉不严谨 希望各位大佬不吝赐教 指点一二思路或者有类似的教程的链接


    刚转行入门的菜鸡 如有描述功能不当还望各位大佬指正批评
    祝大佬 头发浓密 睡眠良好 情绪稳定 抱拳。
    20 条回复    2021-12-30 11:29:38 +08:00
    Lyv5
        1
    Lyv5  
    OP
       183 天前
    index deptname deptfullname upstreamAuthorities
    1 开发中心 开发中心 0
    2 java 开发中心-java 1
    3 Linux 开发中心-java-Linux 2

    格式问题
    Quarter
        2
    Quarter  
       183 天前 via iPhone
    我觉得可以在查询的时候处理拼接,本身数据库存可以不需要存 fullName ,不知道是不是个方法
    vanton
        3
    vanton  
       183 天前   ❤️ 5
    不要存全名,存一个上级 id 。
    从 id 获取到上级名称后拼接。
    Quarter
        4
    Quarter  
       183 天前 via iPhone
    对对,忘记说了,还要个 parentId 的字段保存层级关系
    Wien
        5
    Wien  
       183 天前   ❤️ 1
    1. 查询的时候拼接 deptfullname ,单条记录只存一个 deptname ,修改也只需要修改一条记录。列表查询也直接查出来自己内存中组装 deptfullname 。
    2. 加一个字段存所有上级的 id 路径 upstreamIdPath 。如 3 Linux Linux 2 1/2 。这样后续可以直接通过单条记录快速拼接出 deptfullname 。
    kekxv
        6
    kekxv  
       183 天前 via iPhone
    你这个我觉得直接改数据库更快🐶
    coolmenu
        7
    coolmenu  
       183 天前
    数据库加个 view ,让 python 访问视图呗
    justfindu
        8
    justfindu  
       183 天前
    查询 -java , replace
    h82258652
        9
    h82258652  
       183 天前
    楼主可以看一下树状结构在数据库应该怎么存
    像这个一般会存一个 path(例如 1/3/7)和 parentid
    Lyv5
        10
    Lyv5  
    OP
       183 天前
    springboot 后端修改 例如进入 web 界面修改 一个二级部门 java 为 Python 相应的下级部门全称也要在数据库中修改
    数据库字段不能修改
    Saxton
        11
    Saxton  
       183 天前
    查的时候拼接不行吗,为什么要冗余
    heiyo0
        12
    heiyo0  
       183 天前
    我也有一张这种表,然后我冗余这个 fullname 主要是为了方便能快速的查出单条记录,比如说我能通过“开发中心-java-Linux”,“运维中心-Linux”快速查出这两条记录, 那如果不冗余存储的话,请问是要怎么可以快速查出来呢?我也一直觉得这样冗余存储非常不好,但我又不知道怎么能快速查出单条数据来
    zhouyou457
        13
    zhouyou457  
       183 天前
    如果不想改代码,可以直接在这个表加字段更新触发器。但是数据库的触发器的性能有点儿惨
    sujin190
        14
    sujin190  
       183 天前
    其实这种要是有个有格式的部门编码就好了,比如用 bitint 保存,用 18 个数字作为部门编码,每两个数字组成一个部门 ID ,共可以有 9 级,每级最多可以 99 个部门,一级部门在最前面,后面部门依次往后,不足 18 个数字后面补 0

    比如:

    一级销售部 010000000000000000
    一级研发部 020000000000000000

    二级销售-北京 010100000000000000
    二级研发-java 020100000000000000

    三级研发-java-linux 020101000000000000

    这样查询子级部门啥的就是个大小比较,很方便,新增修改部门也不算麻烦,如果想级别更多,那就搞两个 bigint 字段似乎就行啊,同级别 99 个子级部门估计够用了吧
    pengtdyd
        15
    pengtdyd  
       183 天前
    和 java 没关系,是表结构设计的不行
    chihiro2014
        16
    chihiro2014  
       183 天前
    =。=你数据库里面没必要存名字啊,存 12345 ,然后代码里面写枚举类啊,这样你就不用替换了
    fishDD
        17
    fishDD  
       183 天前
    个人拙见哈,不知道对不对。简单看了下,这里涉及到三个地方:
    1:接口返回名称
    2: 代码中的名称
    3: 数据库名称
    看你想要的最终目的是什么,如果仅仅只是接口返回的话,那可以通过字典表的形式去映射,这样后面如果修改的话,那直接改字典表就行了。
    Itoktsnhc
        18
    Itoktsnhc  
       183 天前
    还是按照层级关系查询然后拼接吧,可能的问题就是 sql 查询次数的问题:
    https://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-an
    或者 fullname 不存一个名字拼接的内容 存 id 的串 比如 1>2>3>4
    qq1398371419
        19
    qq1398371419  
       183 天前   ❤️ 1
    使用嵌套集存储父子关系,可以 O(1)查询出所有子集(包括子集的子集),这样遍历一次修改名称就行 https://docs.microsoft.com/zh-cn/archive/blogs/mvpawardprogram/hierarchies-convert-adjacency-list-to-nested-sets
    dejavuwind
        20
    dejavuwind  
       182 天前
    不能改数据库设计的话:
    严格使用“-”进行拼接,并且名称限制不可以包含“-”,那么使用“-”进行分割然后修改也无不妥吧。按理来说修改不是很频繁的话慢一点倒也无所谓。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1199 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:59 · PVG 06:59 · LAX 15:59 · JFK 18:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.