数据库设计 - 显示可用时间的最佳方式?

时间:2009-03-27 23:33:39

标签: mysql database database-design

我有兴趣看到有关营业时间的数据库设计建议。

这与Facebook的相似 - alt text http://uploader.ws/upload/200903/widget.png

我有一份商家列表,我希望用户能够为该商家输入多套可用营业时间。如,

星期一:9-5开;周二:开放9-12; 1-5;我不希望每天限制在两套小时。理想情况下,每天N小时。如果这不实用,不超过4 ......不低于2.

我对“最佳”(理论)和最实用的解决方案感兴趣。

我使用的DBMS是MySQL。

4 个答案:

答案 0 :(得分:6)

怎么样:

create table business (
  id int not null auto_increment primary key,
  name varchar(255)
);

create table open_hour_range (
  id int not null auto_increment primary key,
  business_id int,
  day_of_week tinyint, /* 0-6 */
  open_time time,
  close_time time,
  foreign key(business_id) references business(id)
);

这允许您任意组合小时,包括每天多次。但是,从查询的角度来看,它可能会有点慢,因为您需要进行大量的加入才能得出业务开放时间列表。

此外,如果您希望能够以如下格式显示小时数:

M-F 9-5 Sa-Su 9-12

您需要在数据库外部的代码中合并类似的范围。如果你想要这种合并,你可以将day_of_week改为start_day和end_day。

答案 1 :(得分:3)

对Scotty Allen模特的一个小调整:

业务表:
  id - int
  business_name - 字符串
open_hour_range表:
  id - int
  business_id - int //业务的外键
  days_of_week-int //(位掩码)1-127
  open_time - 时间
  close_time - 时间

答案 2 :(得分:0)

使用 Microsoft SQL Server 数据库,您可以将该数据存储为类型化的XML ,并且仍然可以根据该字段中的一个或多个值对数据进行排序和搜索。如果需要,进行任何计算等。

该列中的值可能与此类似:

<businessDays>
    <monday>
        <hours from="12" to="15" />
        <hours from="16" to="21" />
    </monday>
    <friday>
        <hours from="13" to="15" />
        <hours from="16" to="18" />
        <hours from="19" to="21" />
    </friday>
</businessDays>

类型化XML

的参考资料

在SQL Server中引用索引和查询XML数据

在您的应用程序中,您可以序列化/反序列化此数据与业务对象之间的对比。

非常简单高效。

答案 3 :(得分:0)

我宁愿在open_timeclose_time列中使用日期时间。它的会议将在晚上开始,并将在第二天早上结束。 :)