Có cách nào tự động kiểm tra thời gian kết thúc lưu trên database và cập nhật lại dữ liệu không?

Em chào mọi người ạ, hiện tại đang làm một trang web sử dụng nodejs và bên cơ sở dữ liệu của em có 1 bảng như sau:

*Bảng A: id, name, endTime, status
Ở cột endTime sẽ chứa thời gian kết thúc , sau khi thời gian kết thúc thì cột satus sẽ được cập nhật nhưng em không biết xử lý như thế nào để phía server có thể tự động check endTime trên database để cập nhật dữ liệu ạ
p/s: em có nghĩ ra một cách đó là setInterval() cứ sau 5-10 giây sẽ thực hiện kiểm tra lại trên database 1 lần nhưng em không chắc đây có 1 phải là 1 cách hay và hợp lý không ạ

Mình không rành về nodejs, chỉ nêu ý tưởng


Các thuộc tính có thể bị thay đổi giá trị vì có ràng buộc vào thứ khác
(ví dụ như status, có thể bị thay đổi dựa theo thời gian)
thì cách tốt nhất là không lưu thuộc tính đó vào database.

Khi được yêu cầu, thuộc tính status sẽ được tính toán trên source code.
VD:
a.status

if now > end_time
    return 'hết hạn'
else
    return 'còn hạn'
5 Likes

Cho em hỏi thêm một tý là nếu như bảng A có thêm cột idHighSrore để lưu id một bản ghi có giá trị cao nhất từ một bảng khác thì mình cũng sẽ xử lý tại source code hay lưu thẳng vào cột idHighSrore ạ, tại cột idHighSrore chỉ được cập nhật ngay khi thời gian kết thúc(endDate) thôi ạ

không cần đến nodejs, bản thân mysql có event scheduler để làm chuyện này
https://dev.mysql.com/doc/refman/5.7/en/create-event.html
có sẵn ví dụ, chỉ cần sửa lại thời gian chạy và câu query là xong

5 Likes

Cho em hỏi thêm một tý là nếu như bảng A có thêm cột idHighSrore để lưu id một bản ghi có giá trị cao nhất từ một bảng khác thì mình cũng sẽ xử lý tại source code hay lưu thẳng vào cột idHighSrore ạ, tại cột idHighSrore chỉ được cập nhật ngay khi thời gian kết thúc(endDate) thôi ạ

Nếu status làm như mình ghi ở trên (tính toán bằng source code),
và khi status thay đổi (quá end_time), bạn muốn cập nhật cột idHighScore nằm trong DB,
có vẻ rắc rối đấy

Nếu là mình thì sẽ bỏ luôn cột idHighScore trong DB, làm tương tự như status
Khi có yêu cầu đến idHighScore thì truy vấn DB,
lấy ra id của record cao điểm nhất với điều kiện là record time <= end_time của table A

3 Likes

Em cảm ơn mọi người ạ, em nghĩ em sẽ thử cách của a @songtotnhe

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?