Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách tốt nhất lưu trữ sự kiện hàng tuần trong MySQL?

Thiết kế bảng lưu sự kiện lặp lại hàng tuần trong MySQL

Cách phổ biến và hiệu quả là sử dụng các cột boolean (tinyint) cho từng ngày trong tuần, kèm theo ngày bắt đầu và kết thúc.

Cấu trúc bảng đề xuất

mysql> CREATE TABLE WeeklyEventDemo (
    -> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EventName VARCHAR(20),
    -> Monday TINYINT(1),
    -> Tuesday TINYINT(1),
    -> Wednesday TINYINT(1),
    -> Thursday TINYINT(1),
    -> Friday TINYINT(1),
    -> Saturday TINYINT(1),
    -> Sunday TINYINT(1),
    -> StartDate DATE,
    -> EndDate DATE
    -> );

Chèn dữ liệu mẫu

mysql> INSERT INTO WeeklyEventDemo(EventName, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, StartDate, EndDate) 
VALUES('Event-1', 0, 0, 0, 0, 1, 0, 0, '2018-03-21', '2019-03-08');

mysql> INSERT INTO WeeklyEventDemo(EventName, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, StartDate, EndDate) 
VALUES('Event-2', 0, 0, 0, 0, 0, 1, 0, '2018-03-21', '2019-03-08');

Truy vấn sự kiện theo ngày trong tuần

Lấy tất cả sự kiện diễn ra vào thứ Sáu:

mysql> SELECT * FROM WeeklyEventDemo WHERE Friday = 1;

Kết quả:

+----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+
| ID | EventName | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday | StartDate  | EndDate    |
+----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+
| 1  | Event-1   | 0      | 0       | 0         | 0        | 1      | 0        | 0      | 2018-03-21 | 2019-03-08 |
+----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+

Ưu điểm của thiết kế này

  • Truy vấn nhanh: Chỉ cần WHERE cột_ngày = 1, có thể index
  • Dễ hiểu: Cấu trúc trực quan, dễ bảo trì
  • Linh hoạt: Hỗ trợ sự kiện lặp nhiều ngày trong tuần
  • Kiểm soát thời gian: StartDate/EndDate giới hạn phạm vi lặp

Mở rộng nâng cao

Để hỗ trợ "tuần xen kẽ" (odd/even weeks), có thể thêm cột WeekPattern TINYINT (1=mỗi tuần, 2=tuần lẻ, 3=tuần chẵn).