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

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

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

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

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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《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 开头表示二进制,没跑测试,如有不准欢迎指出。这种表索引不好创建,场景不明。

10个月前 评论
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
MuBaiYang (楼主) 10个月前
MuBaiYang (楼主) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
kis龍 (作者) 10个月前
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
徵羽宫 10个月前
徵羽宫 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前
讨论数量: 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 开头表示二进制,没跑测试,如有不准欢迎指出。这种表索引不好创建,场景不明。

10个月前 评论
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
MuBaiYang (楼主) 10个月前
MuBaiYang (楼主) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
kis龍 (作者) 10个月前
kis龍 (作者) 10个月前
MuBaiYang (楼主) 10个月前
徵羽宫 10个月前
徵羽宫 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前
kis龍 (作者) 10个月前
徵羽宫 10个月前

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

10个月前 评论
MuBaiYang (楼主) 10个月前
寞小陌 (作者) 10个月前

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

10个月前 评论

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

10个月前 评论
MuBaiYang (楼主) 10个月前

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

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

10个月前 评论
DogLoML

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

10个月前 评论
DogLoML

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

10个月前 评论
MuBaiYang (楼主) 10个月前
DogLoML (作者) 10个月前
DogLoML (作者) 10个月前
MuBaiYang (楼主) 10个月前
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]
10个月前 评论
徵羽宫 (作者) 10个月前
徵羽宫 (作者) 10个月前
徵羽宫 (作者) 10个月前

又菜了一天…. :sob:

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

file

10个月前 评论
MuBaiYang (楼主) 10个月前
徵羽宫 (作者) 10个月前
徵羽宫 (作者) 10个月前
徵羽宫 (作者) 10个月前

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