Thật là một con giun khổng lồ mà bạn đang mở ở đây. Sau khi làm việc cho một công ty mà chỉ có hệ thống clocking nó là cái gì tôi sẽ không bao giờ muốn làm một lần nữa!
Tôi nhận thấy câu trả lời của tôi rất quan trọng và giải quyết một vài vấn đề ngoài phạm vi bình thường của câu hỏi nhưng đây là để phác thảo thiết kế cơ sở dữ liệu và khái niệm cấu trúc trong loại ứng dụng này. Thông tin này đến từ sự phát triển chuyên môn gần đây tôi đã làm trong lĩnh vực này cũng vì vậy nó không chỉ là giả thuyết mà còn được chứng minh trong thực tế.
Khi bạn đang xem loại hệ thống này, tốt nhất bạn nên sử dụng các chỉ số ban đầu là cờ, đây thường là số lượng cú đấm so với mỗi bản ghi. Để so sánh mọi hồ sơ cho 1.000 nhân viên không phải là điều tốt nhất!
Ví dụ: nếu người dùng có trong 24 giờ 8 lần đột xuất (bắt đầu một ngày, bắt đầu nghỉ buổi sáng, kết thúc buổi sáng, bắt đầu ăn trưa, ăn trưa, bắt đầu buổi chiều, cuối giờ nghỉ và cuối ngày) có thể xác định rằng nó không chắc không có cú đấm nào trong thời gian và giờ làm thêm đã xảy ra, tuy nhiên nếu có 7 cú đấm trong khoảng thời gian 24 giờ (bắt đầu một ngày, bắt đầu nghỉ sáng, kết thúc buổi sáng, bắt đầu ăn trưa, ăn trưa, chiều break bắt đầu và kết thúc trong ngày) bạn biết rằng một cú đấm là mất tích và người đó quên đồng hồ trong ngày. Hãy chú ý đến giờ nghỉ cuối tuần không có ở đó.
Tuy nhiên điều này không được minh chứng đầy đủ và chỉ cung cấp một tham chiếu mang tính chỉ dẫn, bạn sẽ cần phải so sánh lịch biểu thay đổi với các cú đấm để đảm bảo không có gì thực sự bị bỏ qua. Bởi vì có thể cả hai bữa ăn trưa cuối và cuối giờ nghỉ đều bị bỏ lỡ để lại 6 cú đấm bạn có thể thiết lập mã của bạn để gắn cờ bất cứ điều gì mà không phải là X số cú đấm cho nhân viên đó. Khi gắn cờ bạn sau đó chạy so sánh thực tế của bạn trên nhân viên đó trong khoảng thời gian đó để tìm ra những gì đã thực sự xảy ra và những gì đã bị bỏ qua. Điều này không có nghĩa là bạn không so sánh tất cả hồ sơ, điều này phụ thuộc vào số lượng nhân viên có thể gây ra một số vấn đề lớn khi so sánh chính xác trên mọi bản ghi, đây là nơi tốt hơn cho số lớn hơn của nhân viên sử dụng 2 máy chủ, 1 để thu thập dữ liệu và chỉ giao diện, thứ hai để chạy các quy trình so sánh. Như tôi đã đề cập, đối với loại ứng dụng này và để làm việc với các lịch biểu khác nhau, bạn cũng cần phải xem xét lịch trình giữ phím shift để so sánh với. Bạn sẽ muốn giữ một bản ghi đệm cho mỗi nhân viên sẽ cho thời gian bằng nhau trước khi bắt đầu thay đổi và sau khi kết thúc thay đổi. Điều này có nghĩa là khả năng làm thêm giờ kéo dài quá 1 khoảng thời gian sẽ là tối thiểu. Công thức cơ bản thực sự đơn giản: số giờ trong ca làm việc - 24 giờ/2 = khoảng thời gian
Bây giờ bạn đặt khoảng thời gian trước và sau lịch trình thay đổi cho người dùng đó. Nhưng bạn vẫn cần phải xử lý một sự hoán đổi thay đổi, thay đổi hoặc nhiều hơn một sự thay đổi 24 giờ. Đây là nơi nó thực sự trở nên phức tạp. Bạn sẽ muốn xem xét việc nắm giữ một bảng thời gian chồng chéo (padding, shift và punches) mà sau đó có thể được đối chiếu với bất kỳ điều chỉnh nào trong tương lai đối với lịch biểu như sau khi thay đổi thực tế không phải là hiếm khi tham dự.
Bây giờ bạn cũng sẽ muốn giữ một bảng thời gian vắng mặt để nghỉ ốm và nghỉ lễ, dữ liệu này sau đó sẽ cần phải được gắn cờ thường trong bảng đục lỗ/đục lỗ vì đây là những gì bạn so sánh. Khi cờ được đặt trong một khoảng thời gian, bản ghi có thể bị bỏ qua so với một ghi chú còn lại trên báo cáo mà không cần chạy các hoạt động bổ sung để kiểm tra nó.
Gần như cuối cùng, hãy chú ý đến cách bạn cần quên các quy ước ngày/giờ bình thường để đo lường điều này cho một loạt các biến? Chưa kể đến hoạt động hiệu quả và hiệu quả trong nhiều ngày? Bởi vì điều này, bạn nói chung là tốt nhất để chỉ làm việc với thời gian bắt đầu và kết thúc bằng dd/mm/YYYY hh: mm: ss, cho các phép đo sử dụng thời gian UNIX để tính toán thời gian đã trôi qua. Trong khi nói rằng để kiểm toán có thể hầu hết các hệ thống cần một bản ghi "tem ngày" để xử lý phía máy chủ của điều này có thể được yêu cầu khi đưa ra các báo cáo. Cuối cùng, tôi cũng khuyên bạn nên giữ bảng kết quả, điều này sẽ cung cấp kết quả báo cáo cho từng người dùng, theo cách này khi bạn muốn cung cấp hồ sơ lịch sử, bạn có thể tự động tạo tài liệu. so sánh hồ sơ mỗi lần báo cáo được yêu cầu.
Tôi hy vọng điều này sẽ hữu ích!
Điều này sẽ làm tăng thêm sự phức tạp không cần thiết để tìm ra xem liệu người đó đã hết giờ trước khi quay lại không. Thiết kế ban đầu là tốt hơn. Nên tránh các bảng EAV ở bất cứ đâu có thể tránh được. – HLGEM
Không, bản gốc trở nên cực kỳ phức tạp, đang kể từ kinh nghiệm. Bất kỳ người mới đi cho thiết kế ban đầu, không lưu ý rằng db không phải là nghĩa vụ cung cấp cho bạn các báo cáo về mong muốn của bạn, nhưng để cung cấp dữ liệu ít nhất là hình thức dư thừa. Bạn có thể giữ một bảng dư thừa báo cáo tổng hợp (từ trong ra) để truy xuất nhanh. – shikhar
@shikhar Bạn có thể vừa phải. Hãy xem câu hỏi này tôi đã đăng. http://stackoverflow.com/questions/12632302/design-to-represent-employee-check-in-and-check-out –