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

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

  •  
  •   luxinfl · 2020-09-24 16:17:35 +08:00 · 2936 次点击
    这是一个创建于 1281 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有平台 P,商户 M,渠道 C,整合表 PMC 。四张表都有各自的停用、启用状态标志。但是 P 、M 、C 的停用时会影响到 PMC 的标志,启用时要去判断 PMC 原先的状态。。我现在想的办法就是在 PMC 中冗余三个字段,分别是 P 的状态,M 的状态,C 的状态。只有所有的状态都是启用,才代表这个 PMC 是可用的
    第 1 条附言  ·  2020-09-25 09:49:43 +08:00

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

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

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

    不能满足的话要么改数据库要么改代码执行逻辑
    hallDrawnel
        13
    hallDrawnel  
       2020-09-24 17:15:55 +08:00
    不是很理解你的业务逻辑。不过可以设计一个状态机,假设你需要处理的状态有 P,M,C,在做变更时,用旧的 P,M,C 初始化状态机,然后进行状态变更后得出新的状态,再继续你的业务逻辑。关于状态机要持有什么状态就根据你的业务逻辑来了。
    reus
        14
    reus  
       2020-09-24 17:21:46 +08:00
    所有不愿意用 join,非要搞什么整合表什么冗余字段的设计,都会受到应有的惩罚,此为一例
    zpfhbyx
        15
    zpfhbyx  
       2020-09-24 17:27:08 +08:00
    按位存?
    luxinfl
        16
    luxinfl  
    OP
       2020-09-24 17:27:55 +08:00
    那么多表关联,看着就头疼
    luxinfl
        17
    luxinfl  
    OP
       2020-09-24 17:28:08 +08:00
    @limuyan44 这么一说,好像有点道理
    admol
        18
    admol  
       2020-09-24 18:05:05 +08:00
    二进制
    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  
       2020-09-24 18:26:54 +08:00
    二进制不就是一个字段表示最多状态的最好方式吗
    aragakiyuii
        20
    aragakiyuii  
       2020-09-24 18:31:10 +08:00 via iPhone
    位运算最简单,PMC 对应 000 和 111

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

    当然这些要结合业务来看
    12tall
        21
    12tall  
       2020-09-25 08:41:23 +08:00
    楼上们说的应该是叫位掩码吧,配合上枚举使用确实挺方便的。刚开始会感觉不直观也很正常
    12tall
        22
    12tall  
       2020-09-25 08:43:31 +08:00
    @12tall 但是我个人还是比较喜欢你自己设计的那个想法 :)
    luxinfl
        23
    luxinfl  
    OP
       2020-09-25 08:57:32 +08:00
    @12tall 加字段那种方法啊,这种确实挺简单的。就是万一再来个状态,就有点蛋疼了。。还是一个字段比较好
    luxinfl
        24
    luxinfl  
    OP
       2020-09-25 08:58:52 +08:00
    @admol 基本就是你说的这么个意思,就是有 4bit,除了 1111->15 之外,都是停用状态。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3136 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:36 · PVG 20:36 · LAX 05:36 · JFK 08:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.