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

快要被一个联动的状态变更搞死了,大佬们,有什么好的实现方法么?

  •  
  •   luxinfl · Sep 24, 2020 · 3730 views
    This topic created in 2073 days ago, the information mentioned may be changed or developed.
    现有平台 P,商户 M,渠道 C,整合表 PMC 。四张表都有各自的停用、启用状态标志。但是 P 、M 、C 的停用时会影响到 PMC 的标志,启用时要去判断 PMC 原先的状态。。我现在想的办法就是在 PMC 中冗余三个字段,分别是 P 的状态,M 的状态,C 的状态。只有所有的状态都是启用,才代表这个 PMC 是可用的
    Supplement 1  ·  Sep 25, 2020

    最终我还是加了一个冗余字段
    ENABLE_SIGN:0停用 1启用
    ENALBE_SIGN_ASSIST:取值从 0000~1111共16个状态
    当且仅当ENALBE_SIGN_ASSIST=1111时,ENABLE_SIGN=1

    24 replies    2020-09-25 08:58:52 +08:00
    waynedream
        1
    waynedream  
       Sep 24, 2020
    视图?
    jy28520
        2
    jy28520  
       Sep 24, 2020
    000 001 010 011 100 101 110 111
    用二进制然后变成一个数就行了啊
    luxinfl
        3
    luxinfl  
    OP
       Sep 24, 2020
    @jy28520 我是想过拆成这种,不过是字符串,每个代表一个状态
    luxinfl
        4
    luxinfl  
    OP
       Sep 24, 2020
    @waynedream 有业务逻辑的额,不能在数据库里面搞
    luxinfl
        5
    luxinfl  
    OP
       Sep 24, 2020
    @jy28520 还有吧,这个不太直观啊。业务逻辑稍显复杂
    jy28520
        6
    jy28520  
       Sep 24, 2020
    你这样说 就没办法了 就事论事 这种最简单
    aimaodeyuer
        7
    aimaodeyuer  
       Sep 24, 2020
    状态机控制
    luxinfl
        8
    luxinfl  
    OP
       Sep 24, 2020
    @aimaodeyuer 不太懂,能具体点不
    luxinfl
        9
    luxinfl  
    OP
       Sep 24, 2020
    @jy28520 因为有四种状态,就有 16 种组合了,有点太繁琐。所以我倾向于搞四个字段。
    ben1024
        10
    ben1024  
       Sep 24, 2020
    二进制实现简单,理解麻烦些
    limuyan44
        11
    limuyan44  
       Sep 24, 2020
    没有人说过 chmod 777 不直观吧,状态也没少到哪里去。
    HashV2
        12
    HashV2  
       Sep 24, 2020
    你先捋清楚业务逻辑,

    业务逻辑清晰以后 看现有的数据库设计和代码执行逻辑能否满足业务逻辑需求

    不能满足的话要么改数据库要么改代码执行逻辑
    hallDrawnel
        13
    hallDrawnel  
       Sep 24, 2020
    不是很理解你的业务逻辑。不过可以设计一个状态机,假设你需要处理的状态有 P,M,C,在做变更时,用旧的 P,M,C 初始化状态机,然后进行状态变更后得出新的状态,再继续你的业务逻辑。关于状态机要持有什么状态就根据你的业务逻辑来了。
    reus
        14
    reus  
       Sep 24, 2020
    所有不愿意用 join,非要搞什么整合表什么冗余字段的设计,都会受到应有的惩罚,此为一例
    justseemore
        15
    justseemore  
       Sep 24, 2020
    按位存?
    luxinfl
        16
    luxinfl  
    OP
       Sep 24, 2020
    那么多表关联,看着就头疼
    luxinfl
        17
    luxinfl  
    OP
       Sep 24, 2020
    @limuyan44 这么一说,好像有点道理
    admol
        18
    admol  
       Sep 24, 2020
    二进制
    P: 1 表示启用,0 表示不启用。对应十进制是 1 和 0
    M: 10 表示启用,00 表示不启用。对应十进制是 2 和 0
    C: 100 表示启用,000 表示不启用。对应十进制是 4 和 0

    PMC:000-111 的组合,对应十进制是 0-7

    假设最初 P,M,C 三个表都是 0 。
    现在启用 P,P 表状态变为 1,PMC 表的状态计算就是: pmcStatus | 1, PMC 状态变为 1, 代表只有 P 是启动的。
    启用 M, M 表状态变为 10,更新 PMC 表的状态:pmcStatus | 10,PMC 状态变为 11,对应十进制为 3,代表 P 和 M 都是启动的。
    启用 C,C 表状态变为 100,更新 PMC 表的状态:pmcStatus | 100,PMC 状态变为 111,对应十进制为 7,代表 P 、M 、C 都是启动的。

    现在要禁用 M,运算就是 pmcStatus & (~10 ),也就是 111 & 101,PMC 结果为 101,代表 P 和 C 是启用的,M 是禁用的

    发现没,其实 P,M,C 就像分别代表的读,写,删权限,PMC 就要用户,用户拥有哪些权限。

    当然,上面说的是基于猜测你的业务逻辑,不对请自己忽略
    maplelin
        19
    maplelin  
       Sep 24, 2020
    二进制不就是一个字段表示最多状态的最好方式吗
    aragakiyuii
        20
    aragakiyuii  
       Sep 24, 2020 via iPhone
    位运算最简单,PMC 对应 000 和 111

    P 启动时候拿 100 和状态值做或运算,M 启动时拿 010 和状态值做或运算,C 启动时拿 001 和状态值做或运算。这样的话,有一个改变不会影响到其他的状态

    当然这些要结合业务来看
    12tall
        21
    12tall  
       Sep 25, 2020
    楼上们说的应该是叫位掩码吧,配合上枚举使用确实挺方便的。刚开始会感觉不直观也很正常
    12tall
        22
    12tall  
       Sep 25, 2020
    @12tall 但是我个人还是比较喜欢你自己设计的那个想法 :)
    luxinfl
        23
    luxinfl  
    OP
       Sep 25, 2020
    @12tall 加字段那种方法啊,这种确实挺简单的。就是万一再来个状态,就有点蛋疼了。。还是一个字段比较好
    luxinfl
        24
    luxinfl  
    OP
       Sep 25, 2020
    @admol 基本就是你说的这么个意思,就是有 4bit,除了 1111->15 之外,都是停用状态。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   898 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    ♥ Do have faith in what you're doing.