最终我还是加了一个冗余字段
ENABLE_SIGN:0停用 1启用
ENALBE_SIGN_ASSIST:取值从 0000~1111共16个状态
当且仅当ENALBE_SIGN_ASSIST=1111时,ENABLE_SIGN=1
1
waynedream 2020-09-24 16:28:22 +08:00
视图?
|
2
jy28520 2020-09-24 16:29:33 +08:00
000 001 010 011 100 101 110 111
用二进制然后变成一个数就行了啊 |
4
luxinfl OP @waynedream 有业务逻辑的额,不能在数据库里面搞
|
6
jy28520 2020-09-24 16:53:56 +08:00
你这样说 就没办法了 就事论事 这种最简单
|
7
aimaodeyuer 2020-09-24 16:54:28 +08:00
状态机控制
|
8
luxinfl OP @aimaodeyuer 不太懂,能具体点不
|
10
ben1024 2020-09-24 16:58:55 +08:00
二进制实现简单,理解麻烦些
|
11
limuyan44 2020-09-24 17:15:05 +08:00
没有人说过 chmod 777 不直观吧,状态也没少到哪里去。
|
12
HashV2 2020-09-24 17:15:31 +08:00
你先捋清楚业务逻辑,
业务逻辑清晰以后 看现有的数据库设计和代码执行逻辑能否满足业务逻辑需求 不能满足的话要么改数据库要么改代码执行逻辑 |
13
hallDrawnel 2020-09-24 17:15:55 +08:00
不是很理解你的业务逻辑。不过可以设计一个状态机,假设你需要处理的状态有 P,M,C,在做变更时,用旧的 P,M,C 初始化状态机,然后进行状态变更后得出新的状态,再继续你的业务逻辑。关于状态机要持有什么状态就根据你的业务逻辑来了。
|
14
reus 2020-09-24 17:21:46 +08:00
所有不愿意用 join,非要搞什么整合表什么冗余字段的设计,都会受到应有的惩罚,此为一例
|
15
zpfhbyx 2020-09-24 17:27:08 +08:00
|
16
luxinfl OP 那么多表关联,看着就头疼
|
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 就要用户,用户拥有哪些权限。 当然,上面说的是基于猜测你的业务逻辑,不对请自己忽略 |
19
maplelin 2020-09-24 18:26:54 +08:00
二进制不就是一个字段表示最多状态的最好方式吗
|
20
aragakiyuii 2020-09-24 18:31:10 +08:00 via iPhone
位运算最简单,PMC 对应 000 和 111
P 启动时候拿 100 和状态值做或运算,M 启动时拿 010 和状态值做或运算,C 启动时拿 001 和状态值做或运算。这样的话,有一个改变不会影响到其他的状态 当然这些要结合业务来看 |
21
12tall 2020-09-25 08:41:23 +08:00
楼上们说的应该是叫位掩码吧,配合上枚举使用确实挺方便的。刚开始会感觉不直观也很正常
|