将营业时间存储在数据库中

目前,我正在试图找出最好的方法来将一个业务的运营时间存储在一个数据库中。

例如:

业务A有以下几个小时的操作

  • 星期一:上午9点 – 下午5点
  • 周二:上午9点 – 下午5点
  • 星期三:上午9点 – 下午5点
  • 星期四:上午9点 – 下午5点
  • 星期五:上午9点 – 下午5点
  • 周六:上午9点至中午12点
  • 周日:closures

目前我有一个类似于以下的数据模型

CREATE TABLE "business_hours" ( "id" integer NOT NULL PRIMARY KEY, "day" varchar(16) NOT NULL, "open_time" time, "close_time" time ) 

在那里“日”被限制在代码(通过ORM)select一周中的第7天。 要testing某个业务是否在某一天closures,它将检查open_time和close_time是否为NULL。 它通过一个中间表(多对多关系)与业务有关。

有没有人对这个数据库scheme有任何build议? 有些事情对我来说似乎不正确。

总的来说,我没有看到这个问题。 除…

  1. 我将使用您的本地编程语言使用的任何编号系统(在其库中)以整数forms存储星期几。 这将减less数据库的大小,并从您的代码中删除string比较。

  2. 我可能会把这个外键放到这个表中的这张表上。 这样你就不需要链接表了。

所以我想我会这样做:

 CREATE TABLE "business_hours" ( "id" integer NOT NULL PRIMARY KEY, "business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses", "day" integer NOT NULL, "open_time" time, "close_time" time ) 

在我的业务逻辑中,我会强制规定每个“业务” 至less有 7个“营业时间”。 ( 至less因为Jon Skeet是正确的,你可能需要rest时间。)虽然你可能想放松这个约束,只需简单地closures业务closures几天的“营业时间”。

这种模式未涉及的一种情况是一天中有几个开放期。 例如,当地酒吧的营业时间为12:00-14:30和17:00-23:00。

也许一个剧院票房是开放的一个日场和一个晚上的表演。

此时,您需要决定是否可以在同一天有多个条目,或者您需要在同一行中表示不同的时间。

那么跨越午夜的开放时间呢? 说酒吧是开放的19:00-02:00。 你不能只比较开始和结束时间与你想testing的时间。

这取决于你需要存储什么以及真实世界的数据是什么样的。
如果您需要确定业务是否在某个特定的时间点开放,那么查询计划可能会有些尴尬。 更重要的是,你是否需要照顾一个中午closures?

一些选项包括;

  • 像你有什么计划,但可以select在同一天有多个时期。 它会迎合午餐rest时间,但会让您很难运行一个查询,让您在某一天的开放时间,例如向用户展示。
  • 位图风格的方法; “000000000111111110000000”为9-5。 这种方法的缺点是你必须select一个特定的粒度,即全部小时或半小时,或者实际上是几分钟。 粒度越精细,数据越难被人读取。 您可以使用按位运算符将此值存储为单个数字而不是整数string,但同样会损害可读性。

我了解到,如果您想让Google数据标记识别您的数据,则应遵循以下准则:

https://schema.org/openingHours

http://schema.org/OpeningHoursSpecification包含“有效date”,这对于一些企业非常有用。;

https://schema.org/docs/search_results.html#q=hours

除非您允许企业与连接表共享相同的小时,否则您应该没有主键就可以了 – 有趣的是,最终您将拥有有限数量的组合; 我不确定会有多less个:p

在我的一个项目中,我使用了列:

[uInt] business_id,[uTinyInt]天,[char(11)] timeRange

如果你想支持OpeningHoursSpecification,那么你需要添加validFrom和validThrough。

时间范围的格式如下:hh:mm-hh:mm

这里有一个parsing它的函数,如果你把它们作为单独的列保存在数据库中,你也可以修改这个函数来parsing一个单独的打开/closures。

根据我的经验,我build议您在一天内允许多次,允许一种方式来判断当天是否明确closures,或者24小时或24小时开放。 我有我的说,如果有一天在数据库中失踪,那么这一天的业务是closures的。

 /** * parseTimeRange * parses a time range in the form of * '08:55-22:00' * @param $timeRange 'hh:mm-hh:mm' '08:55-22:00' * @return mixed ['hourStart'=>, 'minuteStart'=>, 'hourEnd'=>, 'minuteEnd'=>] */ function parseTimeRange($timeRange) { // no validating just parsing preg_match('/(?P<hourStart>\d{1,2}):(?P<minuteStart>\d{2})-(?P<hourEnd>\d{1,2}):(?P<minuteEnd>\d{2})/', $timeRange, $matches); return $matches; } 

可以考虑包含月份/月份/月份的月份/月份的其他字段。 一个月中的某一周有一些小小的“最后”可能是例如第四周或第五周,这取决于年份。