将数据类型存储到数据库时,最佳做法是什么?
例如,您有一个支持服务单功能,其中故障单可以具有以下状态:CHARACTER
,open
,closed
。
您会将其存储为字符串吗?
review
将值存储为整数,因此:+----+----------------+--------+
| id | ticket | status |
+----+----------------+--------+
| 1 | example ticket | open |
| 2 | example ticket | closed |
+----+----------------+--------+
=> 1
,open
=> 2
和closed
=> 3
或字符串。
review
如果要将其保存为整数,是否会创建一个额外的表来解析该状态的名称(假设为+----+--------+
| id | status |
+----+--------+
| 1 | 1 |
| 2 | 2 |
+----+--------+
表)?
support_ticket_states
或者你会在客户端做到这一点,例如:
+----+----------------+--------+
| id | ticket | status |
+----+----------------+--------+
| 1 | example ticket | 1 |
| 2 | example ticket | 2 |
+----+----------------+--------+
什么是最佳选择?
答案 0 :(得分:1)
这取决于个人喜好。
firstname_id=1
?猜不了...... 我的偏好:如果可以是与该条目相关的信息 - 请使用映射表。如果保证保持"单字符串",将其存储为字符串。
选择上面的例子:
status
可以通过更多信息进行扩展,例如"一般时间响应","说明","团队负责人"等... - >映射if ($ticket->status == 1) {
echo 'Open';
}
这取决于您的本地化方式,如果有的话。没有"权利"并且"错误",只是"工作"并且"不工作"。 : - )
我会将其保留为数据库中的open
,closed
,然后 - 当它本地化时 - 使用"代码"正确翻译该条目,而不是数据库查询。 (Loacalization东西可以很容易地缓存和预加载,不需要过度设计的查询,因为你没有。)
echo getLocalizedContent($ticket->status, $user->getLanguage());
(语言信息可以与会话一起存储,因此不需要作为参数传递):
echo getLocalizedContent($ticket->status);
答案 1 :(得分:0)
将其存储为字符串有太多缺点(例如,存储效率低下)。
您的第二个选项(将其存储为整数)更有效。但是,如果希望字符串表示可编辑,请仅使用附加表。否则,您无需延长数据库请求的运行时间。您的示例(打开/关闭)似乎是一个可以硬编码的用例,然后对运行时更有效。
如果您的数据库接受更小的数据类型(例如,tinyint,smallint),我会使用最合适的数据类型,而不是简单的整数(除非您计划稍后添加许多其他状态)。
答案 2 :(得分:0)
对于大量数据,存储整数并对其进行索引会使查询比varchars更快
答案 3 :(得分:-1)
我认为它取决于您的应用程序的大小。如果您的应用程序足够大,则应为每张故障单创建一个表格,以便打开'关闭'审核'这样就可以轻松快捷地获取数据。
另一方面,你可以通过if条件来处理它。