状态-使用哪种数据类型?

时间:2018-07-06 10:31:05

标签: php mysql

我目前正在查看自己编写的代码,并试图提高其可读性和质量。这是一个如何解决一个简单问题的示例,我一直觉得这是一个糟糕的解决方案。

具有以下“状态”或本示例中的海拔级别的用户表

  1. 员工
  2. 主管
  3. 管理员

(这些可以是任何东西,例如,一个项目可以具有“未完成”,“暂停”和“完成”状态)

过去,我总是将其存储为INT值,然后在打印出帐户及其状态时,我将编写一个函数将此功能转换回文本,以打印在页面上,例如

if userLevel === 3 { return "Admin"; };

这一直感觉是一个不好的解决方案,而且也不是很灵活。添加任何新类型的帐户都将需要更新功能。这种格式也使阅读页面限制变得非常困难。

如果我要添加以下行:

if userLevel !== 2 OR 3 { // Redirect to error page };

您会看到,这怎么可能使线路混乱。

最近,我已经开始纯粹将这些“状态”存储为字符串,以使其更具可读性。但是现在我对Laravel有了更多的了解,我想知道是否应该有专门用于此目的的其他数据库表。

所以我的问题-这种数据合适的数据类型是什么,与之交互的理想方式是什么?

2 个答案:

答案 0 :(得分:0)

在旧版代码中,我将使用常量,基本上位实际上与其中的哪种数据无关紧要。它可读性强,您可以轻松找到用法,IDE可以帮助您。

在具有大量业务逻辑的新代码中,可以创建一个代表状态的小类,以便可以将逻辑放在那里。

在DB中-您可以找到几篇文章,指出枚举不是一个好主意。如果您想优化很多,tinyint可以为您提供帮助,但是使用短字符串也可以(我通常会使用它)。然后,您应该将其翻译为php ofc,我建议上述对象方法。

答案 1 :(得分:0)

这可能适合或不适合您的特定应用程序,但是我经常发现按位操作对于在单个整数中具有0 or more属性很方便。

例如假设您分配了以下内容:

$admin = 0b1; //(1)
$employee = 0b10; //(2)
$supervisor = 0b100; //(4)

现在您要为$status分配一个整数值,该值是按位的or适当值。

因此,主管是employeesupervisor,因此他们的整数值为

2|4 = 0b010 | 0b100 = 0b110 = 6

现在,当您想查看用户是否有status时,只需屏蔽以下内容即可:

if(($statusInt & $supervisor) != 0){
    // it is a supervisor...  //maybe more, at least supervisor
}

您当然可以通过这种方式在单个整数或INT数据库列中包含更多statuses