2010-06-18 52 views
2

我想知道如果有人知道yelp如何確定什麼餐館「現在打開」?我正在開發一個類似的應用程序使用HTML/JavaScript/PHP的。我每天都會在我的數據庫中出現一列,用逗號分隔「2243」格式(下午10:43)。例如,如果餐廳在午餐和晚餐時間開放,則可能是「1100,1400,1700,2200」。那麼我會檢查(使用js)當前時間是否在當前日期的某個範圍內。我還希望能夠確定一家餐廳是「晚上開放」還是「晚開放」等等,對於那些我想檢查開放範圍是否與特定範圍重疊的人。確定餐廳現在是否開放(如yelp)使用數據庫,php,js

有沒有更好的方法來做到這一點?特別是如何將時間存儲在數據庫中,然後確定它們是否與給定的小時數重疊。

謝謝。

+0

你的方法是不是很好,數據庫將是非常困難的進一步查詢。看到羅曼的答案 - 更好的解決方案。此外,我建議你reead關於數據庫規範化,就像維基http://zh.wikipedia.org/wiki/Database_normalization – 2010-06-18 14:26:19

回答

3

你一定要重新設計數據庫。將多個值放入單個列中是違反規範化規則的重大違規行爲,並會導致很多令人頭疼的事情。單列應始終保存一條信息。

您還應該使用正確的數據類型。不要把時間放在一個字符串中,因爲你最終可能會以「foo」作爲時間,然後你會怎麼做?

相反,你可能想要的是:

CREATE TABLE Restaurants 
(
    restaurant_id INT   NOT NULL, 
    restaurant_name VARCHAR(40) NOT NULL, 
    CONSTRAINT PK_Restaurants PRIMARY KEY CLUSTERED (restaurant_id) 
) 
CREATE TABLE Restaurant_Hours 
(
    restaurant_id INT   NOT NULL, 
    hours_id   INT   NOT NULL, 
    day_of_week  SMALLINT NOT NULL, 
    start_time  TIME  NOT NULL, -- Depends on your RDBMS and which date/time datatypes it supports 
    end_time   TIME  NOT NULL, 
    CONSTRAINT PK_Restaurant_Hours PRIMARY KEY CLUSTERED (restaurant_id, hours_id) 
) 

然後,您可以很容易地檢查餐館開在給定時間:

SELECT 
    R.restaurant_id, 
    R.restaurant_name 
FROM 
    Restaurants R 
WHERE 
    EXISTS 
    (
     SELECT * 
     FROM 
      Restaurant_Hours RH 
     WHERE 
      RH.restaurant_id = R.restaurant_id AND 
      RH.start_time <= @time AND 
      RH.end_time >= @time AND 
      RH.day_of_week = @day_of_week 
    ) 

如果你有一個跨越午夜你將一個時隙需要兩行 - 第一天一個,午夜一個 - 第二天「x」。另外,請記住從GUI使用時要記住時區。

+0

如果有些餐館在午餐時間開放,然後在晚上再開放,那麼每天都會有兩排餐廳;而其他人整天都在開放......比解析「1100,1400,1700,2200」和「1100,2200」 – 2010-06-18 14:33:26

+0

要容易得多。我是數據庫新手,但我可以看到這比我原來的想法好得多。如果每家餐廳的時間​​表中有7個(或更多,如果餐廳有單獨的午餐/晚餐時間)條目,對吧?我想你在那裏忘了RH.day_of_week = R.day_of_week,對吧? – vee 2010-06-18 14:36:23

+0

謝謝,我已經糾正它包括現在的星期幾。如果餐廳每週7天營業,那麼你會有7排。如果他們在同一天關閉並再次打開(或者在午夜過了幾個小時),那麼您可能會有超過7個。 – 2010-06-18 15:05:06

2

我將有一個表名爲REST_HOURS具有以下字段:在OPEN_TIME

CREATE TABLE REST_HOURS (
REST_ID integer NOT NULL 
,OPEN_TIME time NOT NULL 
,CLOSE_TIME time NOT NULL 
PRIMARY KEY (`REST_ID`) 
) ; 

指數和CLOSE_TIME

話,我會做一個查詢,如:

select REST_ID from REST_HOURS where CURTIME() >= OPEN_TIME and CURTIME() <= CLOSE_TIME 
當然

你可以隨時替換CURTIME()(您可能希望添加開放和關閉的星期幾,因爲一些餐館的時間可能不同,例如星期天)

+0

謝謝你的解決方案! – vee 2010-06-18 14:39:14