一个tinyint(4)字段保存7条服务(值为0-5)的评价结果?

需求背景:
需要实现一个评价功能,只有一个tinyint(4)字段保存评价的值。

评价分为:
承包商对员工的评价,分为三条,分数范围为0-5
员工对承包商的评价,分为四条,分数范围也是 0-5

需求实现:
不改动数据库表的情况下,保存这两种评价状态,且完整记录 这7条服务的评价分数。

问题:
大家有好的实现思路吗?
目前思路有
1、用位运算实现,但位运算实现只能记录一种状态,无法记录 0-5的分值。
2、用和的方式实现,但可以存起来,取的时候不好区分了,无法做到分值与评价结果一对一。

请问大家有好的存储和查询的方式吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

已知条件:

  1. tinyint(4) 的范围是0 到 255, 或 2^0-1 到 2^8-1
  2. 2 个 0-5 分, 6 个值 * 2 存储在 1 个字段内
  3. 明确提示不允许添加字段

那就下面的把



0b01111111; // 7 位有效位
0b111; // 7
// 到这里就好说了

$score = 0b0100100; // 36, 2 个都是 4 分

$employeeScore =  0x7 & ($score >> 3); // 前面的 0x7 可以省略,如果数据填写不严谨,可能造成数据不准
$employeeScore = 0x7 & $score;

PS: 0b 开头表示二进制,没跑测试,如有不准欢迎指出。这种表索引不好创建,场景不明。

1年前 评论
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
MuBaiYang (楼主) 1年前
MuBaiYang (楼主) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
kis龍 (作者) 1年前
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
徵羽宫 1年前
徵羽宫 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前
讨论数量: 42

已知条件:

  1. tinyint(4) 的范围是0 到 255, 或 2^0-1 到 2^8-1
  2. 2 个 0-5 分, 6 个值 * 2 存储在 1 个字段内
  3. 明确提示不允许添加字段

那就下面的把



0b01111111; // 7 位有效位
0b111; // 7
// 到这里就好说了

$score = 0b0100100; // 36, 2 个都是 4 分

$employeeScore =  0x7 & ($score >> 3); // 前面的 0x7 可以省略,如果数据填写不严谨,可能造成数据不准
$employeeScore = 0x7 & $score;

PS: 0b 开头表示二进制,没跑测试,如有不准欢迎指出。这种表索引不好创建,场景不明。

1年前 评论
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
MuBaiYang (楼主) 1年前
MuBaiYang (楼主) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
kis龍 (作者) 1年前
kis龍 (作者) 1年前
MuBaiYang (楼主) 1年前
徵羽宫 1年前
徵羽宫 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前
kis龍 (作者) 1年前
徵羽宫 1年前

修改一下长度的事 有必要搞成这么复杂吗?

1年前 评论
MuBaiYang (楼主) 1年前
寞小陌 (作者) 1年前

到时候查的时候你就知道有多爽了

1年前 评论

换成int,base_convert七进制保存 :joy:

1年前 评论
MuBaiYang (楼主) 1年前

用位运算的其实有通用的解决方法。我这边写过一个通用的类可供参考(BitEncoder),最多支持64种状态。

二进制最大值 3896,需要 SMALLINT 类型字段。

1年前 评论
DogLoML

0-5,一个评价有6种状态,7条评价,也就是 6^7=279936,这么多种状态,一个tinyint怎么塞进去

1年前 评论
DogLoML

干脆存7个tinyint,省事而且可读性高 :joy:

1年前 评论
MuBaiYang (楼主) 1年前
DogLoML (作者) 1年前
DogLoML (作者) 1年前
MuBaiYang (楼主) 1年前
a0 = 0
a1 = a0 + 5 + 1 
a2 = a0 + 5 + a1 + 5 + 1 
a3 = a0 + 5 + a1 + 5 + a2 + 5 + 1 
a4 = a0 + 5 + a1 + 5 + a2 + 5 + a3 + 5 + 1  
a5 = a0 + 5 + a1 + 5 + a2 + 5 + a3 + 5 + a4 + 5 + 1 
a6 = a0 + 5 + a1 + 5 + a2 + 5 + a3 + 5 + a4 + 5 + a5 + 5 + 1 
...
an = a0 + 5 + a1 + 5 + .... a{n-1} + 5 + 1

假设 n = 10 请写出一个程序求 an :

解:

def calc(n):
    val = []
    for i in range(n):
        if i == 0:
            val.append(0)
        else:
            val.append(sum([val[v] + 5 for v in range(len(val))]) + 1)
    return val
min = calc(7)
max = [min[i] + 5 for i in range(len(min))]

print(min)
print(max)

[0, 6, 17, 39, 83, 171, 347]
[5, 11, 22, 44, 88, 176, 352]
1年前 评论
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前

又菜了一天…. :sob:

数据库存的当然还是十进制, 然后写一个 encode 和一个 decoder 就好

file

1年前 评论
MuBaiYang (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!