跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 快要被一个联动的状态变更搞死了,大佬们,有什么好的实现方法么?
未分類
2020 年 9 月 28 日

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

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

資深大佬 : luxinfl 2

现有平台 P,商户 M,渠道 C,整合表 PMC 。四张表都有各自的停用、启用状态标志。但是 P 、M 、C 的停用时会影响到 PMC 的标志,启用时要去判断 PMC 原先的状态。。我现在想的办法就是在 PMC 中冗余三个字段,分别是 P 的状态,M 的状态,C 的状态。只有所有的状态都是启用,才代表这个 PMC 是可用的
大佬有話說 (24)

  • 資深大佬 : waynedream

    视图?

  • 資深大佬 : jy28520

    000 001 010 011 100 101 110 111
    用二进制然后变成一个数就行了啊

  • 主 資深大佬 : luxinfl

    @jy28520 我是想过拆成这种,不过是字符串,每个代表一个状态

  • 主 資深大佬 : luxinfl

    @waynedream 有业务逻辑的额,不能在数据库里面搞

  • 主 資深大佬 : luxinfl

    @jy28520 还有吧,这个不太直观啊。业务逻辑稍显复杂

  • 資深大佬 : jy28520

    你这样说 就没办法了 就事论事 这种最简单

  • 資深大佬 : aimaodeyuer

    状态机控制

  • 主 資深大佬 : luxinfl

    @aimaodeyuer 不太懂,能具体点不

  • 主 資深大佬 : luxinfl

    @jy28520 因为有四种状态,就有 16 种组合了,有点太繁琐。所以我倾向于搞四个字段。

  • 資深大佬 : ben1024

    二进制实现简单,理解麻烦些

  • 資深大佬 : limuyan44

    没有人说过 chmod 777 不直观吧,状态也没少到哪里去。

  • 資深大佬 : HashV2

    你先捋清楚业务逻辑,

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

    不能满足的话要么改数据库要么改代码执行逻辑

  • 資深大佬 : hallDrawnel

    不是很理解你的业务逻辑。不过可以设计一个状态机,假设你需要处理的状态有 P,M,C,在做变更时,用旧的 P,M,C 初始化状态机,然后进行状态变更后得出新的状态,再继续你的业务逻辑。关于状态机要持有什么状态就根据你的业务逻辑来了。

  • 資深大佬 : reus

    所有不愿意用 join,非要搞什么整合表什么冗余字段的设计,都会受到应有的惩罚,此为一例

  • 資深大佬 : zpfhbyx

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

  • 主 資深大佬 : luxinfl

    那么多表关联,看着就头疼

  • 主 資深大佬 : luxinfl

    @limuyan44 这么一说,好像有点道理

  • 資深大佬 : admol

    二进制
    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

    二进制不就是一个字段表示最多状态的最好方式吗

  • 資深大佬 : aragakiyuii

    位运算最简单,PMC 对应 000 和 111

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

    当然这些要结合业务来看

  • 資深大佬 : 12tall

    上们说的应该是叫位掩码吧,配合上枚举使用确实挺方便的。刚开始会感觉不直观也很正常

  • 資深大佬 : 12tall

    @12tall 但是我个人还是比较喜欢你自己设计的那个想法 :)

  • 主 資深大佬 : luxinfl

    @12tall 加字段那种方法啊,这种确实挺简单的。就是万一再来个状态,就有点蛋疼了。。还是一个字段比较好

  • 主 資深大佬 : luxinfl

    @admol 基本就是你说的这么个意思,就是有 4bit,除了 1111->15 之外,都是停用状态。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具