2013-10-23 14 views
5

Tôi muốn lưu trữ thời gian mở cửa cho các cửa hàng khác nhau trong cơ sở dữ liệu. Hiện tại, tôi đang làm việc với giải pháp đơn giản nhất:Cách lưu trữ thời gian mở cửa hàng khác nhau trong cơ sở dữ liệu

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"); 

Ý tưởng tiếp theo của tôi về tăng cường là;

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" 
); 

Nhưng điều này vẫn dẫn đến một số vấn đề:

  • ngày với nhiều lần là không thể. (8am đến 11am & 1pm đến 6pm)
  • Có rất nhiều trường không sử dụng/dư thừa vì nhiều bộ dữ liệu của tôi có thời gian cố định mỗi ngày hoặc mở 24/7
  • Chúng không dễ tìm kiếm.
  • Không thể trình bày ngày lễ.

Vì vậy, bây giờ tôi tự hỏi nếu có một cách linh hoạt để lưu trữ thời gian mở cửa. Có thể theo cú pháp như WD[1-5]{8-18},WD[6]{8-14},CD[12/25-12/26]{!0-24} trong đó WD có nghĩa là ngày trong tuần và CD đại diện cho ngày lịch hoặc phạm vi ngoại lệ và ! có nghĩa là đóng.

Có cách nào phổ biến để lưu trữ thông tin như thế này?

Trả lời

14

Đồng hóa dữ liệu của bạn

cửa hàng nó như

shop_ID, Weekday, Start_hour, end_hour 

ngày trong tuần có thể có giá trị từ 1 đến 7, như là một sản phẩm của

SELECT DAYOFWEEK('2007-02-03') 

giờ bắt đầu và giờ cuối cùng có thể được lưu trữ trong thời gian http://dev.mysql.com/doc/refman/5.0/en/time.html

với điều này bạn sẽ có tất cả mọi thứ bao phủ

Để tìm giờ vào một ngày cho một cửa hàng bạn sẽ làm gì

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

Cần 2 khoảng thời gian trong một ngày cho một cửa hàng? không có vấn đề,

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

Đối với trường hợp ngoại lệ, bạn có thể thêm một exceptions table với ngày tháng và các cửa hàng. Bạn có thể truy vấn điều đó và nếu nó là null (không có ngoại lệ), hãy trả về giờ mở cửa. Ngoài ra, bạn có thể lưu trữ mọi ngày cho mỗi cửa hàng, nhưng điều đó sẽ làm nổi bật dữ liệu của bạn.

+3

bạn sẽ xử lý trường hợp câu lạc bộ đêm như thế nào khi họ nói mở cửa lúc 22:00 và đóng cửa lúc 5:00 sáng? – Weltschmerz

+0

Đối với trường hợp chung, một datetime bắt đầu đơn giản và datetime kết thúc sẽ bao gồm bất kỳ khả năng nào. Ví dụ trên là cho một trường hợp rất cụ thể. vì vậy tôi sẽ nói table opening_times, các cột (id, start_datetime, end_datetime) và tạo nó cho tất cả các tương lai có thể nhìn thấy được. Nếu bạn muốn định kỳ hàng tuần và kết thúc bằng ngày trong tuần, chỉ cần thêm một cột ngày trong tuần khác, chẳng hạn như start_weekday, start_hour, end_weekday, end_hour – AdrianBR

Các vấn đề liên quan