mysql - 存储一系列值

时间:2011-09-18 18:29:24

标签: mysql

我有一个资源,其中包含一个可用性字段,其中列出了可供使用的一天中的小时数?

例如。 res1在一天0-8,19-23小时之间可用,此处的范围可以是逗号分隔的小时范围值。例如,对于24小时访问是0-23,0-5,19-23或0-5,12-15,19-23

存储此产品的最佳方法是什么? char是个不错的选择吗?当访问资源时,我的php需要使用此处定义的小时检查当前小时,然后决定是否允许此访问。我可以请求mysql告诉我当前小时是否在此处指定的范围内吗?

3 个答案:

答案 0 :(得分:0)

我将商品的可用性存储在一个单独的表中,对于我所拥有的每一行(给出您的示例):

id,startHour,endHour,resourceId

我只是在开始和结束时使用整数。然后,您可以使用HOUR(NOW())或者您拥有的内容,针对联接进行查询以查看当天某个小时的可用性。

(另一方面,我会更喜欢像MongoDb这样的非关系型数据库)

答案 1 :(得分:0)

1)创建资源可用性表,进行规范化。

CREATE TABLE res_avail
{
    ra_resource_id int,
    ra_start TIME,
    ra_end TIME

    # add appropriate keys for optimization here
)

2)为列表中的每个范围填充($ resource_id,'$ start_time','$ end_time')(使用explode())

3)然后,您可以查询:(例如,PHP)

sql = "SELECT ra_resource_id FROM res_avail where ('$time' BETWEEN ra_start AND ra_end)";

...

答案 2 :(得分:0)

我知道这是一个老问题,但是自从v5.7起,MySQL支持以JSON格式存储值。这意味着您可以将所有范围存储在一个JSON字段中。如果您想使用JavaScript在前端显示开放时间,那就太好了。但是,当您要显示当前打开的所有位置时,这不是最佳解决方案,因为在JSON字段上进行查询意味着要进行全表扫描。但是,如果您一次只需要检查一个地方,那就可以了。例如,您加载了显示一个地方的详细信息的页面,并显示该地方是打开还是关闭。