Php 如何设置一个SQL表,以便高效轻松地存储单个事件的多个日期和时间?
我有一个事件列表,希望在SQL数据库中存储事件的开始和结束时间。问题是,有些事件只在一天内发生,而其他事件则在多天内发生。有时,这些事件每天只发生一次,而其他事件则发生多次(更多说明,请参见下面的示例) 如何设置我的Php 如何设置一个SQL表,以便高效轻松地存储单个事件的多个日期和时间?,php,mysql,sql,database,schema,Php,Mysql,Sql,Database,Schema,我有一个事件列表,希望在SQL数据库中存储事件的开始和结束时间。问题是,有些事件只在一天内发生,而其他事件则在多天内发生。有时,这些事件每天只发生一次,而其他事件则发生多次(更多说明,请参见下面的示例) 如何设置我的事件表以有效存储所有版本的开始和结束日期和时间? 需要存储在表中的示例数据: 作为补充说明,如果需要,我可以将日期和时间存储为Unix日期时间,但是如果需要,我更愿意单独存储值(以便以后更容易访问/隔离/使用) 编辑: 我忘了补充一点,我希望解决方案能够独立于一个表中。我不想使用S
事件
表以有效存储所有版本的开始和结束日期和时间?
需要存储在表中的示例数据:
作为补充说明,如果需要,我可以将日期和时间存储为Unix日期时间,但是如果需要,我更愿意单独存储值(以便以后更容易访问/隔离/使用) 编辑: 我忘了补充一点,我希望解决方案能够独立于一个表中。我不想使用SQL
联接
或外键
组合多个表(例如事件
表和事件时间
表)
编辑#2:
…我希望只有两列左右(不是
start\u datetime1
,end\u datetime1
,start\u datetime2
,end\u datetime2
,等等)。创建事件时间表?其中包含以下类似的内容(想法):
这样,您就可以拥有多个事件id,而且您可以拥有您描述的任何格式(跨多天、单日等)创建一个事件时间表?其中包含以下类似的内容(想法):
这样,您就可以拥有多个事件id,而且您可以拥有您描述的任何格式(跨多天、单日等)通常,您的选择是: 1) 同一行中的开始日期/时间(可能还有结束日期/时间) 。。。或者 2) 每个时隙的单独行(以及唯一的“事件id”) 根据你所说的,你可能想要选择2
3) 我想进一步冒险,也许“时间段”应该是它自己的、单独的表(外键为“事件id”)。一般来说,您的选择是: 1) 同一行中的开始日期/时间(可能还有结束日期/时间) 。。。或者 2) 每个时隙的单独行(以及唯一的“事件id”) 根据你所说的,你可能想要选择2
3) 我想进一步冒险,也许“时间段”应该是它自己的、单独的表(外键是“事件id”)。一个选项是为日期创建一个单独的表。然后,事件和日期之间就有了一对多的关系。日期表将引用事件的id。然后,您可以通过搜索事件的键来获取给定事件的所有日期 一个选项是为日期创建一个单独的表。然后,事件和日期之间就有了一对多的关系。日期表将引用事件的id。然后,您可以通过搜索事件的键来获取给定事件的所有日期 很好的解决方案,但我忘了添加一个小细节。。。我不想执行任何连接或使用外键。我希望这是完全独立的。根据您的要求,除非您不介意像start\u datetime1、end\u datetime1、start\u datetime2、end\u datetime2、start\u datetime3、end\u datetime3、start\u datetime4、end\u datetime4。。。我认为这不太可能。。。但对于数据库,我不是专家,所以您可以等待更好的解决方案:)令人沮丧,但这正是我所担心的。我曾想到过多个
start\u datetime
,end\u datetime
字段,但希望能有更好的选择。谢谢你的帮助。你也可以将日期时间存储在一个php序列化字符串中,然后像那样保存到数据库中,每次需要时都取消序列化。。。但请注意,这根本不是一个推荐的做法,通常是不赞成的,因为如果一个“事件”有一个、两个或多个“开始/结束”时间,那么事件和日期之间绝对存在“一对多”关系。这意味着您肯定应该有一个单独的“事件时间段”表。很好的解决方案,但我忘了添加一个小细节。。。我不想执行任何连接或使用外键。我希望这是完全独立的。根据您的要求,除非您不介意像start\u datetime1、end\u datetime1、start\u datetime2、end\u datetime2、start\u datetime3、end\u datetime3、start\u datetime4、end\u datetime4。。。我认为这不太可能。。。但对于数据库,我不是专家,所以您可以等待更好的解决方案:)令人沮丧,但这正是我所担心的。我曾想到过多个start\u datetime
,end\u datetime
字段,但希望能有更好的选择。谢谢你的帮助。你也可以将日期时间存储在一个php序列化字符串中,然后像那样保存到数据库中,每次需要时都取消序列化。。。但请注意,这根本不是一个推荐的做法,通常是不赞成的,因为如果一个“事件”有一个、两个或多个“开始/结束”时间,那么事件和日期之间绝对存在“一对多”关系。这意味着您肯定应该有一个单独的“事件时间段”表。答案取决于你使用的数据库。您提到了“SQL数据库”,但其中有很多。MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。例如,如果您使用的是PostgreSQL,则可以使用数组字段类型来存储所有以前值的历史记录。答案取决于您使用的数据库。您提到了“SQL数据库”,但其中有很多。MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。例如,如果您使用的是PostgreSQL,则可以使用数组字段类型
Event Name | # of Participants | Times and Dates
==========================================================================================================
Three-legged-race | 14 | 08:00 - 09:30 on Mar 23
------------------------------------------------------------------------------------------------------
Pie/Hot Dog Eating Contests | 9 | 12:00 - 14:00 and
| | 15:30 - 17:30 on Mar 23
------------------------------------------------------------------------------------------------------
Decathlon | 37 | 10:00 - 14:00 on Mar 23
| | 11:00 - 16:00 on Mar 24
------------------------------------------------------------------------------------------------------
Daily Opening/Closing Ceremonies | 100 | 07:50 - 08:00 and
| | 17:30 - 17:40 on Mar 23
| | 07:50 - 08:00 and
| | 17:30 - 17:40 on Mar 24
EventTime (id, event_id, start_datetime, end_datetime)