数据存储为VARCHAR与INT,“转换”服务器端与客户端

时间:2013-07-24 13:10:35

标签: encoding client-side server-side

我正在努力解决存储数据的最佳方式 - 直接来自用户的“原始”数据与需要翻译的“编码”数据。以下是指示患者血压测量位置的选择列表的具体示例:

<select id="location">
<option value="1">Office</option>
<option value="2">Home</option>
<option value="3">Hospital</option>
<option value="4">Work</option>
<option value="5">Other</option>
</select>

过去,我会将存储变量VARCHAR设置为全部小写的“办公室”,“家庭”,“医院”,“工作”,“其他”。但是在过去的一个月里,我一直在想,或许更“优雅”的方法是将它存储为整数“代码”(如上例所示),然后在从表中读取时将其翻译,就像这样服务器端翻译:

  $location=$row['location'];
  if ($location == '1') {$location = "Office";}
  else if ($location == '2') {$location = "Home";}
  else if ($location == '3') {$location = "Hospital";}
  else if ($location == '4') {$location = "Work";}  
  else if ($location == '5') {$location = "Other";}

所以我对你的noob问题有点哲学 -

  1. 你总是/有时将数据存储为“原始”VARCHAR数据,还是用“整数/布尔”等“编码”?你有标准吗?

  2. 如果您对数据进行“编码”,那么它是“解码”服务器端还是客户端?

  3. 我提前感谢你的想法。

1 个答案:

答案 0 :(得分:0)

答案是: magic numbers不好。在任何情况下都不应在代码中使用if ($foo == 4),因为,简单地说, WTF会“ 4“是什么意思?

如果有的话,为此目的使用常量:

define('HOSPITAL', 4);

if ($foo == HOSPITAL) ...

这不是一半,因为你不再与潜在的无意义的价值直接接触。如果您必须调试应用程序,您将在任何地方看到该值,包括数据库。 ENUM在这里很有用,但PHP不支持它们。但数据库确实如此。因此,折衷方案是在数据库中使用ENUMs并在PHP中使用常量:

CREATE TABLE foos (
    foo ENUM('hospital', 'office', ...)
);

define('HOSPITAL', 'hospital');

if ($foo == HOSPITAL) ...

这会给你:

  • 数据库中的类型安全和减少存储
  • 在PHP中进行类型安全和最低效处理
  • 编写和调试代码时的完全清晰度