【问题标题】:Strings vs integers for storing data [closed]用于存储数据的字符串与整数 [关闭]
【发布时间】:2017-03-11 16:30:06
【问题描述】:

在将数据类型存储到数据库时,最佳实践是什么?

例如,您有一个支持票证功能,其中票证可以具有以下状态:openclosedreview

你会把它存储为字符串吗?

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

将值存储为整数,因此:1 => open2 => closed3 => review 或作为字符串。

+----+--------+
| id | status |
+----+--------+
|  1 | 1      |
|  2 | 2      |
+----+--------+

如果您将其保存为整数,您是否会创建一个额外的表来解析该状态的名称(比如说support_ticket_states 表)?

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

或者你会在客户端这样做吗,例如:

if ($ticket->status == 1) {
    echo 'Open';
}

什么是最好的选择?

【问题讨论】:

  • 如果它只有 3 个不同的状态,一个 Enum 是合适的。你可以将枚举存储在数据库中吗?
  • 您可以将其存储为枚举。似乎确实是最好的选择,您可以将其发布为答案,以便我将其标记为已解决吗?感谢您的快速回复
  • 通常情况下,如果可能的状态数量有限,则应该使用 Enum。这样,如果传递了无效值,它可能会在编译时被捕获。除非您创建宏,否则原始整数/字符串不会为您提供这种能力。我会写一个答案,但是我很长时间没有使用PHP或mysql。
  • 用于打开和关闭你 1 或 0。
  • @RobertRocha 我们在讨论多个选项,而不仅仅是关闭/打开的布尔值

标签: php mysql database laravel


【解决方案1】:

这取决于个人喜好。

  • firstname:您会将“Daniel”存储为字符串,还是将每个用户映射到firstname_id=1?猜不着……
  • 状态:新建/打开,只有 2 个选项,但这里我会使用映射。
  • 每小时/每天 2 个选项,但这里我会采用字符串类型。

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

选择上面的例子:

  • 名字始终保持为一个“名字”,更改名字不应影响其他用户。 -> 字符串
  • status 可以扩展更多信息,例如“一般响应时间”、“描述”、“团队负责人”等... -> 映射
  • hourly/daily:没什么好说的,非此即彼。 -> 字符串

if ($ticket->status == 1) {
    echo 'Open';
}

这取决于您如何进行本地化(如果有)。没有“对”和“错”,只有“工作”和“不工作”。 :-)

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

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

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

echo getLocalizedContent($ticket->status);

【讨论】:

  • 没错!我现在正在做的是使用enum 来存储值openclosedreview,然后根据语言环境翻译这些值。与 Laravel Eloquent Mutators 一起工作非常顺利,因为每次我解析 Ticket 模型时,状态属性都会是一个包含实际值和翻译值的对象(而不是字符串):)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我认为这取决于您的应用程序有多大。如果您的应用程序足够大,您应该为每个工单创建“open”、“close”、“review”表。以便轻松快速地获取数据。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        相关资源
        最近更新 更多