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).