Mysql 数据库中的保存时间:字符串与时间戳

Mysql 数据库中的保存时间:字符串与时间戳,mysql,database-design,timestamp,Mysql,Database Design,Timestamp,我有一个数据库,每个条目都是一个业务,一些数据是打开和关闭时间。最初,为了支持一天中的多个打开和关闭时间,我打算将其存储为字符串,例如:“09:00-15:00,17:00-22:00”,然后将其拆分并转换为服务器端的时间戳。我现在明白了将时间存储为字符串是一种“糟糕的形式”。但解决方案需要第二张表 使用字符串而不是日期或时间戳到底有什么问题?如果我把它都放在一个表中,它将被当前查询提取出来,然后被处理并转换成时间戳。使用多个表会导致更多查询。字符串操作和转换真的比另一个查询在整个表中搜索数千个

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


使用字符串而不是日期或时间戳到底有什么问题?如果我把它都放在一个表中,它将被当前查询提取出来,然后被处理并转换成时间戳。使用多个表会导致更多查询。字符串操作和转换真的比另一个查询在整个表中搜索数千个条目要费力得多吗?

通过
'09:00-15:00,17:00-22:00'
,您的意思是它会打开两段时间吗?然后在一个表中显示两行。如果开放时间因一周中的某一天而不同,则需要另一列来指定该时间。如果你想要假期,另一个专栏

但是。。。你将如何处理这些数据

如果您打算编写SQL以使用《泰晤士报》,那么我所描述的可能会最有效

如果处理将在应用程序代码中进行,那么每次加载、每次解析等的CSV文件可能是最好的


或者,您可以将该CSV文件作为一个大字符串放入表中。(但是,这与拥有一个文件没有太大区别。)

通过
'09:00-15:00,17:00-22:00'
,您的意思是它会打开两段时间?然后在一个表中显示两行。如果开放时间因一周中的某一天而不同,则需要另一列来指定该时间。如果你想要假期,另一个专栏

但是。。。你将如何处理这些数据

如果您打算编写SQL以使用《泰晤士报》,那么我所描述的可能会最有效

如果处理将在应用程序代码中进行,那么每次加载、每次解析等的CSV文件可能是最好的


或者,您可以将该CSV文件作为一个大字符串放入表中。(然而,这与拥有一个文件没有太大区别。)

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

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

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

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

对于第二个问题,对于我使用的DBMS系统,最好将时间间隔描述为两个时间戳并排,而不是将它们组合成一个时间间隔。但是,有些DBMS系统的时间间隔数据类型不同于时间戳数据类型。您的里程可能会有所不同

对于第三个问题,最好使用DBMS时间戳数据类型来描述时间点,而不是字符串。不同的DBMS产品有不同的功能来存储一个没有任何日期的时间,在您的情况下,您可能希望利用这个功能。这取决于您将如何搜索数据。如果要查找包含9:00到15:00时间范围的所有行,而不考虑日期,则需要使用此选项。如果您想在任何周二查找包含9:00到15:00范围的所有行,我建议您研究数据仓库技术

为什么?

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

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


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

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

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

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

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

对于第二个问题,对于我使用的DBMS系统,最好将时间间隔描述为两个时间戳并排,而不是将它们组合成一个时间间隔。但是,有些DBMS系统的时间间隔数据类型不同于时间戳数据类型。您的里程可能会有所不同

对于第三个问题,最好使用DBMS时间戳数据类型来描述时间点,而不是字符串。不同的DBMS产品有不同的设施来存储没有日期的时间