使用PostgreSQL存储每小时的可用性

时间:2011-09-19 02:06:18

标签: sql postgresql binary

我有一个想法是使用二进制字符串来存储每小时的可用性,我希望社区运行该字符串以获取建议。

我的想法是生成一个二进制字符串,指示一周中任何给定小时的可用性,使用“0”表示不可用,“1”表示可用。然后,我可以使用按位“和”运算符查询带有“当前小时”整数的二进制列。字符串看起来像下面的

# Open sunday at 6:00am and close at 6:00pm (repeats 0 for remainder of hours)
000000111111111111000000...

在星期日下午4:00查看该页面将使用前一个字符串按位“和”运行:

# Sunday at 4:00pm (repeats 0 for remainder of hours)
000000000000000100000000

如果返回的按位比较结果导致值大于1,则记录当前可用。

我有两个问题。第一个是我应该将值存储为哪种数据类型。它最多为168位(7天* 24小时)。第二个是Postgres提供的功能,可以完成我提到的功能。像这样:

# String truncated for readability
WHERE some_column & $number_for_current_hour > 0

感谢阅读!任何反馈都表示赞赏。

2 个答案:

答案 0 :(得分:4)

如果同时存储“开放时间”和“关闭时间”,您可能会感觉更好。这将使开发人员更容易处理。如果您在白天需要多个开放时段,例如早上开放,午餐关闭,然后在下午再次开放的地方,我建议您创建一个“开放时间”的表格。 “打开时间”和“关闭时间”以及链接回原始表的外键,以便您可以存储多个打开期间。你可能认为你对你的位置或东西很聪明,但实际上只是让事情变得更复杂。此外,您无法容纳半小时内发生的事情,甚至更精细的分辨率。重新阅读问题,我看到你要存储多天。如果你每天需要不同的开放时间,那么我的第二个解决方案就能很好地运作。有一张这样的桌子。

ID(INT),F_ID(INT),DAY_OF_WEEK(INT),OpenTime(时间),CloseTime(时间)

ID只是此表的自动增量,F_ID是返回原始表的外键,星期几可以是表示星期几的整数或枚举,OpenTime和CloseTime是可以存储时间的“时间”字段,没有约会。这应该让事情变得更加清晰,以及其他任何人将来必须处理代码。此外,查找可能会更快,因为您可以索引时间字段。执行二进制xor相当于使用“LIKE'%word%'来搜索字符串,应该避免使用。

答案 1 :(得分:0)

如果这是MySQL我会告诉你使用SET数据类型,但PostgesSQL似乎没有。相反,你需要BIT数据类型,它可以工作,但不是很方便。