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

2020-09-24 16:17:35 +08:00
 luxinfl
现有平台 P,商户 M,渠道 C,整合表 PMC 。四张表都有各自的停用、启用状态标志。但是 P 、M 、C 的停用时会影响到 PMC 的标志,启用时要去判断 PMC 原先的状态。。我现在想的办法就是在 PMC 中冗余三个字段,分别是 P 的状态,M 的状态,C 的状态。只有所有的状态都是启用,才代表这个 PMC 是可用的
2958 次点击
所在节点    程序员
24 条回复
waynedream
2020-09-24 16:28:22 +08:00
视图?
jy28520
2020-09-24 16:29:33 +08:00
000 001 010 011 100 101 110 111
用二进制然后变成一个数就行了啊
luxinfl
2020-09-24 16:38:59 +08:00
@jy28520 我是想过拆成这种,不过是字符串,每个代表一个状态
luxinfl
2020-09-24 16:42:55 +08:00
@waynedream 有业务逻辑的额,不能在数据库里面搞
luxinfl
2020-09-24 16:46:43 +08:00
@jy28520 还有吧,这个不太直观啊。业务逻辑稍显复杂
jy28520
2020-09-24 16:53:56 +08:00
你这样说 就没办法了 就事论事 这种最简单
aimaodeyuer
2020-09-24 16:54:28 +08:00
状态机控制
luxinfl
2020-09-24 16:56:09 +08:00
@aimaodeyuer 不太懂,能具体点不
luxinfl
2020-09-24 16:57:16 +08:00
@jy28520 因为有四种状态,就有 16 种组合了,有点太繁琐。所以我倾向于搞四个字段。
ben1024
2020-09-24 16:58:55 +08:00
二进制实现简单,理解麻烦些
limuyan44
2020-09-24 17:15:05 +08:00
没有人说过 chmod 777 不直观吧,状态也没少到哪里去。
HashV2
2020-09-24 17:15:31 +08:00
你先捋清楚业务逻辑,

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

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

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

当然这些要结合业务来看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710145

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX