2009-01-09 16 views
6

Tôi cần phải lưu trữ xem có điều gì xảy ra một lần, hàng ngày, ngày trong tuần, hàng tuần, một số ngày trong tuần, một số ngày trong tháng hay không, có thể là số hoặc biểu tượng, như thứ Hai đầu tiên của mỗi tháng, v.v.Bạn có thể lưu trữ thời gian định kỳ như thế nào?

Bất kỳ đề xuất nào? Bất kỳ mã, cấu trúc dữ liệu hoặc lược đồ nào để xem?

Trả lời

1

này nghe có vẻ giống như một "sự kiện lặp đi lặp lại" như trong Outlook. Tôi sẽ sử dụng một bảng gọi là RecurrenceType để lưu trữ từng khoảng thời gian (hàng ngày, hàng tuần, v.v.) Một bảng khác được gọi là Sự kiện có thể tham chiếu bằng khóa đến RecurrenceType. Các ngày trong tương lai đối với hầu hết các loại lặp lại sau đó có thể được tính toán bằng cách sử dụng các hàm Ngày chuẩn.

8

Có các giải pháp phức tạp và giải pháp dễ dàng. Hai giải pháp đơn giản nhất là:

  1. Đặt các sự kiện lặp lại cho một số trường hợp không đổi hoặc lên đến một số phạm vi ngày cố định trong tương lai. Lưu trữ một FK recurrence_id với mỗi cá thể trỏ đến mô tả về sự lặp lại và cho phép chỉnh sửa và hủy hàng loạt.

    Ưu điểm của phương pháp tiếp cận quạt đã được xử lý trước là nó rất dễ dàng để thực hiện các trường hợp ngoại lệ lặp lại, gần như chắc chắn sẽ là yêu cầu tính năng đầu tiên bạn nhận được.

  2. Tính tại thời gian hiển thị. Máy tính nhanh, tùy thuộc vào các câu hỏi bạn muốn có thể trả lời về dữ liệu của bạn, thường sẽ dễ dàng tính toán tất cả các lần xuất hiện trong một phạm vi ngày. Bạn có thể thông minh và cố gắng nhanh chóng đặt phạm vi ngày của mình trước khi thực hiện phép tính lặp lại hoặc bạn có thể bạo lực từ ngày bắt đầu.

Ngoài ra, bạn chỉ cần một giải pháp để lưu trữ quy tắc lặp lại hoạt động với bất kỳ điều gì bạn đang sử dụng để tính toán lặp lại. (ví dụ: nếu bạn đang sử dụng thư viện cho phép iCalendar, lược đồ của bạn là varchar (255) có giá trị RRULE trong đó)

Nếu bạn đang phải cuộn máy tính lặp lại của riêng mình, và bạn muốn giữ nó đơn giản, hạn chế sự lặp lại của bạn cho hàng ngày, hàng tuần, hàng tháng hoặc hàng năm bao gồm trường hợp sử dụng 80% đầu tiên của bạn và dễ dàng bị calc hóa.

Tại thời điểm đó schema tái phát tiềm năng của bạn trông giống như sau:

id 
recurrence_start 
recurrence_end 
type (daily|weekly|monthly|yearly) 
day_of_week (for weekly) 
month 
day_of_month 

Và thẳng thắn những giải pháp phức tạp có lẽ không phải là giá trị nó :)

+0

Xin chào, bạn sẽ triển khai phạm vi sự kiện (ngày bắt đầu và ngày kết thúc) khi sử dụng lược đồ lặp lại bạn đã cung cấp như thế nào? Bất kỳ ý tưởng? Tôi đang gặp rất nhiều rắc rối khi thiết kế một cái gì đó như thế này. Cảm ơn! – Tom

1

Vấn đề là có những khả năng vô hạn để xác định như thế Một khoảng. Ví dụ: "Thứ hai đầu tiên của mỗi tháng khác nếu ngày đó là đồng đều, nhưng không phải là 4 và tháng đó không phải là tháng 2 của một năm dài". Bạn sẵn sàng đi bao xa? Cuối cùng, bạn sẽ phải làm cho người dùng gõ vào một biểu thức boolean đánh giá thành TRUE vào những ngày mà sự kiện đó sẽ tái diễn. Không phải là rất tốt đẹp từ một quan điểm giao diện người dùng.

Bạn nên quyết định một số hạn chế cho hệ thống của mình. Một khi bạn biết những điều đó, phần còn lại phải dễ dàng - hoặc ít nhất là có thể trả lời trên SO. :)

3

Martin Fowler đã viết a really great paper về việc này. Bạn có thể tìm thấy rất nhiều ý tưởng tương tự mà anh ta thảo luận trong runt, một thư viện Ruby để xử lý các biểu thức thời gian.

+1

Giấy của Fowler rõ ràng và dễ đọc, nhưng nó không giải quyết các ngoại lệ đối với quy tắc, IMO là một trong những vấn đề đang cháy với mẫu thiết kế này ... –

0

Nó được đề cập trên a related, useful SO thread, nhưng một tốt đẹp, tích cực duy trì thay thế cho còi cọc nếu bạn tình cờ được sử dụng Ruby ice_cube. Bạn đã không đề cập đến các yêu cầu phụ trợ lưu trữ của bạn là gì, nhưng đối với lược đồ cơ sở dữ liệu, @ kellan và một số trong chuỗi đề cập ở trên là khởi đầu tốt.

Các vấn đề liên quan