mysql - 数据库中的保存时间 : STRING vs TIMESTAMP

标签 mysql database-design timestamp

我有一个数据库,每个条目都是一个商家,其中一些数据是营业时间和营业时间。最初,为了支持一天中的多个打开和关闭时间,我打算将其存储为字符串,例如:“09:00-15:00,17:00-22:00”,然后将其拆分并转换为时间戳服务器端。我现在明白将时间存储为字符串是“不好的形式”。但该解决方案需要第二个表。

使用字符串而不是 DATE 或 TIMESTAMP 到底有什么问题?如果我将所有内容保存在一张表中,它将与我当前的查询一起提取,然后进行处理并转换为时间戳。使用多个表会导致更多查询。字符串操作和转换真的比搜索整个表(最终会包含数千个条目)的另一个查询要繁重得多吗?

最佳答案

这里存在三个独立的问题。一是是将两个基本数据项组合成一个列表并将该列表存储在一个位置更好,还是将基本数据项分开并将它们存储在两个不同的位置更好。出于这些目的,我考虑将单行和单列的交集作为一个位置。

第二个问题是将时间间隔识别为单个基本项更好,还是将时间间隔描述为并排的两个基本项更好。

第三个问题是将时间点存储为字符串更好还是使用 DBMS 时间戳数据类型更好。

对于第一个问题,最好将单独的基本项目存储在不同的位置。在本例中,位于同一个表的两个单独的行中。

对于第二个问题,对于我使用的 DBMS 系统来说,将时间间隔描述为并排的两个时间戳比将它们组合成一个间隔更好。但有些 DBMS 系统的时间间隔数据类型与时间戳数据类型不同。你的旅费可能会改变。

对于第三个问题,最好使用DBMS时间戳数据类型来描述时间点而不是字符串。不同的 DBMS 产品具有不同的工具来存储没有任何关联日期的时间,根据您的情况,您可能需要使用它。这取决于您将如何搜索数据。如果您想要查找包含 9:00 到 15:00 时间范围(无论日期如何)的所有行,您将需要利用此功能。如果您想要查找任何星期二包含 9:00 到 15:00 范围的所有行,我建议您研究数据仓库技术。

为什么?

对于前两个答案,它与规范化、索引、搜索策略和查询优化有关。这些概念都是相关的,每个概念都将帮助您理解其他三个概念。

对于第三个答案,它与使用 DBMS 的功能来为您完成详细的工作有关。任何好的 DBMS 都会有工具来减去时间戳以产生时间间隔,并正确排序时间戳。让 DBMS 为您完成这项工作将为您节省应用程序编程中的大量工作,并且通常在生产中使用更少的计算机资源。

话虽如此,我不了解 mySQL,所以我不知道它对于日期操作或查询优化有多好。

关于mysql - 数据库中的保存时间 : STRING vs TIMESTAMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47764226/

相关文章:

java - ResultSet 关闭后不允许进行操作第 2 部分

MYSQL LOW LIMIT VALUE 减慢我的查询

postgresql - 在函数中更改架构名称

sql - Oracle:如何查找模式中上次更新(任何表)的时间戳?

elasticsearch - Elasticsearch 1.5不会添加_timestamp

mysql - 使用MySQL判断今天是否是用户生日

mysql - 如何归档最少使用的数据?

sql - 不能在 FROM 子句中指定更新的目标表

mysql - 如何使两个具有不同模式的数据库保持最新

mysql - 与同一实体的记录的数据库关联关系