2013-10-23 62 views
5

我想在數據庫中存儲不同店鋪的開業時間。目前我正在使用最簡單的解決方案:在數據庫中存儲各種開店時間的方法

CREATE TABLE opening_times(
shop_id int(3) NOT NULL, 
times varchar(1000) NOT NULL 
); 

INSERT INTO opening_times VALUES(3,"Mon-Fri 8:30 to 18:00 
Sat 9:00 to 12:00"); 

INSERT INTO opening_times VALUES(4,"24/7"); 

INSERT INTO opening_times VALUES(5,"Mon-Sun 8am-8pm"); 

我對增強功能的下一個想法是;

CREATE TABLE opening_times(
shop_id int(3) NOT NULL, 
monday varchar(11) NOT NULL, 
tuesday varchar(11) NOT NULL, 
wednesday varchar(11) NOT NULL, 
thursday varchar(11) NOT NULL, 
friday varchar(11) NOT NULL, 
saturday varchar(11) NOT NULL, 
sunday varchar(11) NOT NULL 
); 

INSERT INTO opening_times VALUES(
3, 
"09:30-18:30", 
"09:30-18:30", 
"09:30-18:30", 
"09:30-18:30", 
"09:30-18:30", 
"09:30-12:30", 
"CLOSED" 
); 

但是,這仍然會導致一些問題:

  • 天多次是不可能的。 (上午8時至11時&下午1點至下午6點)
  • 有很多未使用/冗餘字段,我的很多數據集,每天有固定的時間或每天24小時開放
  • 他們是不容易的搜索。
  • 假期無法表示。

所以現在我想知道是否有靈活的方式來存儲開放時間。可能在語法上如WD[1-5]{8-18},WD[6]{8-14},CD[12/25-12/26]{!0-24},其中WD表示工作日,而CD表示日曆日或範圍,!表示關閉

有沒有一種常見的方式來存儲這樣的信息?

回答

14

規範化數據

存儲它作爲

shop_ID, Weekday, Start_hour, end_hour 

工作日可具有1到7之間的值,如

SELECT DAYOFWEEK('2007-02-03') 

開始小時和結束小時的輸出可以被存儲在時間http://dev.mysql.com/doc/refman/5.0/en/time.html

這個你本來一切都覆蓋

要找到個小時對店鋪的日期,你會做

select start_hour, end_hour from table where weekday=dayofweek(curdate()) and shop_id=1 

需要2個時間間隔爲一個店一天?沒問題,

`shop ID, weekday, start_hour, end_hour` 
1;   1;  08:00:00 ; 09:00:00 
1;   1;  10:00:00 ; 11:00:00 

例外情況,您可以使用日期和商店添加exceptions table。你可以查詢,如果它是空的(沒有例外),則返回開放時間。或者,您可以存儲每個商店的每個日期,但這會膨脹您的數據。

+3

當他們說開放的週五22:00並且關閉週五的時候,你會如何處理夜總會的情況? – Weltschmerz

+0

對於一般情況,簡單的開始日期時間和結束日期時間將涵蓋任何可能性。上面的例子是針對一個非常特殊的情況。所以我會說表opening_times,列(id,start_datetime,end_datetime),並創造它爲所有可預見的未來。如果您想每週重複使用並最終使用工作日,只需添加另一個工作日欄,例如start_weekday,start_hour,end_weekday,end_hour – AdrianBR

相關問題