Thiết kế hệ thống hẹn giờ cho trang tin tức
Chủ đề này trong thực tế rất nhiều bạn vướng mắc nhưng không biết cách giải đáp, nên trong bài này tôi sẽ đưa ra một giải pháp và các bạn sẽ cùng tôi thảo luận chủa đề này nhé. Và trước tiên ta sẽ tìm hiểu qua về cơ chế lưu trữ kiểu ngày tháng trong mysql.
1. Cơ chế lưu trữ kiểu ngày tháng trong mysql
Như bạn biết trong mysql chúng ta có thể lưu định dạng ngày tháng là kiểu date, kiểu datetime. Đây là hai kiểu chính và các bạn rất thường hay sử dụng để tìm kiếm. Nhưng có một sự thật mà ít bạn quan tâm đến đó là nếu như bạn truy vấn với kiểu INT và có index thì tốc độ sẽ rất nhanh. Ý của tôi tức là thay vì ta lưu kiểu date hoặc datetime thì ta tạo thêm một field kiểu UNSIGN INT nữa và dùng code PHP để chuyển ngày tháng sang trước khi lưu vào CSDL.
Trong mysql năm bắt đầu ta sẽ tính bắt đầu từ năm 1970 và tới nay là năm 2014, tính ra khoảng 44 năm. Và tổng khoảng thời gian 44 năm này chuyển sang kiểu INT sẽ có tổng cộng 1407612770 giây. Nhưng trong mysql, kiểu UNSIGN INT chỉ lưu trữ tới mức khoảng 4294967295 là hết, như vậy tính ra ta còn có thể lưu thê được ít nhất hơn 60 năm nữa mới max. Tới lúc đó thì công nghệ phát triển rồi nên chắc chắn sẽ ko bị hạn chế như vậy.
2. Ý tưởng thiết kế dữ liệu cho chức năng hẹn giờ
Ý tưởng thứ nhất chính là phần phân tích cơ chế lưu trữ trong mysql trên.
Bài viết này được đăng tại [free tuts .net]
Ý tưởng thứ 2 dựa vào ý tưởng thứ nhất ta sẽ lưu trữ một field gọi là news_timer (kiểu UNSIGN INT), field này có giá trị chính là thời gian mà người dùng chọn đăng bài. Như vậy khi hiển thị danh sách tin tức thì ta chỉ cần thêm điều kiện lọc ngày hiện tại phải lơn hoặ hoặc bằng ngày hiển thị trong timer.
Như bạn biết, khi làm việc với tin tức ta sẽ có một field gọi là status, giá trị bằng 1 là hiển thị, giá trị bằng 0 là không hiển thị. Vậy gộp lại ta có điều kiện lọc nhu sau:
Select * from news where status = 1 and timer <= $bien_kieu_int_time_hien_tai
Với điều kiện lọc như vậy thì ta thấy cũng tối ưu rồi, vì cả hai điều kiện ta có thể đánh chỉ số index. Nhưng có cách nào tối ưu hơn không? Để trả lời câu hỏi này các bạn chú ý đến phần phân tích thời gian từ 1970 tới nay mà tôi đề cập ở trên, ta sẽ có ý tưởng như sau:
Chọn thời gian max chính là giá trị max của kiểu UNSIGN INT, tức là số 4294967295, tôi chọn 4200000000 cho chẵn.
Như vậy ta sẽ bỏ đi field status, còn mỗi field timer thôi. Nếu người dùng chọn ẩn tin thì ta sẽ thiết lập gái trị cho timer bằng 4200000000, còn không thì ta lưu thời gian bình thường. Như vậy khi hiển thị tin ta chỉ lọc đúng một điều kiện timer duy nhất. Ta đánh chỉ mục index nữa thì tốc độ sẽ nhanh hơn rất nhiều.
3. Lời kết
Ý tưởng này tôi đã thực hiện trong dự án của bản thân nên hôm nay tôi muốn chia sẽ với các bạn với mong muốn giúp một số bạn có cái nhìn ra xa hơn về vấn đề phân tích CSDL. Và tôi cũng mong muốn nhận được nhiều ý kiến đóng góp từ chính các bạn. Thân chào và hẹn gặp lại ơ bài gần nhất.