我需要设计一种数据库存储方式,比如一个酒吧或一家餐馆。这些开放时间每天都有所不同,它们需要使用9:30或8:15等小时,而不仅仅是整数。
这是我想出的:
opening_hours: {
normal_days: {
mon: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
tue: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
wed: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
thu: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
fri: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
sat: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
sun: {
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
},
},
special_days: {
date: Date,
name: String,
start: { type: Number, min: 0, max: 23 },
end: { type: Number, min: 0, max: 23 },
is_closed: Boolean,
},
},
不幸的是,我找不到更好的方法。您认为该问题的最佳方案是什么?
答案 0 :(得分:0)
我认为这没有太多问题(除了它不包括23:00-24:00),就是这样:
如果我正在设计此属性,则不会在属性名称中使用缩写。例如,Id使用完整的“星期四”,然后在对象本身中输入类似shorthand : 'THU'
的内容。我也避免在任何地方都将小时数设为0-23。可能类似
{
...
shorthand: "THU"
startHours: 0-23,
endHours: 0-23,
startMinutes: 0-59,
endMinutes: 0-59,
startInMilliseconds: 0 - 24 * 60 * 60 * 1000 - 1,
endInMilliseconds: 0 - 24 * 60 * 60 * 1000 - 1
}
这将允许您跨时区和类似的时间工作,因为您可以轻松地操纵Unix纪元时间。将时间分成几个小时和几分钟,可以让您到达23:59,加上格式只是${thursday.startHours}:${thursday.startMinutes}
,而不是从23.75-> 23:45进行转换的一些怪异数学。
当然,这全部取决于您数据的实际用例。
答案 1 :(得分:0)
opening_hours: {
normal_days: {
monday: {
start: { type: Date, default: new Date().setHours(8, 0, 0, 0) },
end: { type: Date, default: new Date().setHours(4, 30, 0, 0) },
},
tuesday: {
start: { type: Date, },
end: { type: Date, },
},
}
}
查询数据库时,您可以分别获取小时或分钟的组成部分。日期对象存储日期,时间和时区。大多数编程语言都具有从Date对象解析小时,分钟和时区的功能。 MongoDB具有$ hour,$ minute和$ dayOfWeek运算符。
答案 2 :(得分:0)
我曾经遇到过同样的问题,这就是我的实现方式:
opening_hours: [{
day: {type Date}, //mon - sun
periods: [{
start: {type Date},
end: {type Date}
}]
}]
periods
是数组的原因是您可能会喜欢
[
{
start: 9h00,
end: 11h00
},
{
start: 13h00,
end: 18h00
}
]
希望如此...