用于存储数据的字符串与整数

时间:2017-03-11 16:30:07

标签: php mysql database laravel

将数据类型存储到数据库时,最佳做法是什么?

例如,您有一个支持服务单功能,其中故障单可以具有以下状态:CHARACTERopenclosed

您会将其存储为字符串吗?

review

将值存储为整数,因此:+----+----------------+--------+ | id | ticket | status | +----+----------------+--------+ | 1 | example ticket | open | | 2 | example ticket | closed | +----+----------------+--------+ => 1open => 2closed => 3或字符串。

review

如果要将其保存为整数,是否会创建一个额外的表来解析该状态的名称(假设为+----+--------+ | id | status | +----+--------+ | 1 | 1 | | 2 | 2 | +----+--------+ 表)?

support_ticket_states

或者你会在客户端做到这一点,例如:

+----+----------------+--------+
| id |     ticket     | status |
+----+----------------+--------+
|  1 | example ticket | 1      |
|  2 | example ticket | 2      |
+----+----------------+--------+

什么是最佳选择?

4 个答案:

答案 0 :(得分:1)

这取决于个人喜好。

  • 名字:你会存储" Daniel"作为字符串,或将每个用户映射到firstname_id=1?猜不了......
  • status:new / open,只有2个选项,但在这里我会使用映射。
  • 每小时/每天2个选项,但在这里我会采用字符串类型。

我的偏好:如果可以是与该条目相关的信息 - 请使用映射表。如果保证保持"单字符串",将其存储为字符串。

选择上面的例子:

  • firstname始终为单个" firstname",更改名称不应影响其他用户。 - >串
  • status可以通过更多信息进行扩展,例如"一般时间响应","说明","团队负责人"等... - >映射
  • 每小时/每日:没有什么可说的了,它是或者。 - >串
if ($ticket->status == 1) {
    echo 'Open';
}

这取决于您的本地化方式,如果有的话。没有"权利"并且"错误",只是"工作"并且"不工作"。 : - )

我会将其保留为数据库中的openclosed,然后 - 当它本地化时 - 使用"代码"正确翻译该条目,而不是数据库查询。 (Loacalization东西可以很容易地缓存和预加载,不需要过度设计的查询,因为你没有。)

echo getLocalizedContent($ticket->status, $user->getLanguage());

(语言信息可以与会话一起存储,因此不需要作为参数传递):

echo getLocalizedContent($ticket->status);

答案 1 :(得分:0)

将其存储为字符串有太多缺点(例如,存储效率低下)。

您的第二个选项(将其存储为整数)更有效。但是,如果希望字符串表示可编辑,请仅使用附加表。否则,您无需延长数据库请求的运行时间。您的示例(打开/关闭)似乎是一个可以硬编码的用例,然后对运行时更有效。

如果您的数据库接受更小的数据类型(例如,tinyint,smallint),我会使用最合适的数据类型,而不是简单的整数(除非您计划稍后添加许多其他状态)。

答案 2 :(得分:0)

对于大量数据,存储整数并对其进行索引会使查询比varchars更快

答案 3 :(得分:-1)

我认为它取决于您的应用程序的大小。如果您的应用程序足够大,则应为每张故障单创建一个表格,以便打开'关闭'审核'这样就可以轻松快捷地获取数据。

另一方面,你可以通过if条件来处理它。