Làm thế nào nên lưu trữ các nhiệm vụ lịch lặp đi lặp lại trong cơ sở dữ liệu?


14

Đây là một dự án cá nhân nhỏ cho quản lý vi mô. Về cơ bản, tôi lưu trữ các tác vụ trong cơ sở dữ liệu SQLite3 trông như thế này:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

Vì vậy, mỗi tác vụ có một ngày đáo hạn (thời hạn) được lưu trữ dưới dạng Dấu thời gian Unix. Cho đến nay rất tốt, tôi có thể thực hiện các mục như "ngày mai: thăm bà" và một hàng mới được tạo với "thăm bà" là nhãn và ngày mai chuyển thành thời hạn Unix.

Bây giờ tôi muốn nhập loại nhiệm vụ mới: thói quen - nhiệm vụ được lặp lại theo mô hình thời gian, như "hàng ngày: bếp sạch". Làm thế nào những nhiệm vụ như vậy có thể được lưu trữ hoặc mô hình hóa?

Hiện tại, tôi nghĩ rằng, trong trường hợp một nhiệm vụ cần phải thực hiện hàng ngày, để tạo các hàng mới trong bảng của tôi sẽ có cùng nhãn và trường thời hạn tăng thêm một ngày. Trong trường hợp này, tôi cần sửa một giới hạn trong tương lai. Ví dụ, nếu tôi tạo một thói quen cho mỗi ngày, nó sẽ tạo ra một hàng mới cho mỗi ngày của năm còn lại.

Có cách nào đơn giản hơn để làm điều này? Tôi có thiếu một số nguyên tắc thiết kế cơ sở dữ liệu rõ ràng?


3
Đúng. Sử dụng một công cụ lập lịch thích hợp thay vì phát minh ra một lịch trình công việc khác. Sau SOPA cuộc biểu tình kết thúc, đọc en.wikipedia.org/wiki/Open_Source_Job_Scheduler . Điều này đã được giải quyết, độc đáo, rất nhiều lần rồi.
S.Lott

cảm ơn Lott! vâng tôi nghi ngờ rằng có một giải pháp tao nhã cho việc này! Tôi sẽ chờ kết thúc của SOPA hoặc kiểm tra xem có bản dịch ở các quốc gia Wikipedia khác hay không cách cho một tập lệnh greasemonkey nhỏ :)
François Vespa ت

1
Lưu ý chung: Hầu hết các bài đăng dưới đây không tính đến câu hỏi làm thế nào dữ liệu được lưu trữ thực sự. Tôi có nghĩa là được giao một nhiệm vụ lặp lại mỗi thứ Hai trong 2 năm, bao nhiêu hàng sẽ cần phải được ghi vào đĩa?
NoChance


@ root45 thật tuyệt, tôi thực sự sử dụng lynx từ dòng lệnh, thậm chí còn dễ dàng hơn :)
François Vespa ت

Câu trả lời:


7

Bạn có thể tạo một bảng riêng để định kỳ. Nhưng thành thật mà nói, tôi sẽ đặt nó vào cùng một bảng với Trường Loại.

Một cái gì đó như thế này:

ID - Int Pk

TaskDescription - TEXT

Type - Text - (Re-Occurring, or Single Occurrence) 

Due- TimeStamp - for Single Occurrence is the Date time

LastTimeCompleted - Time Stamp

ReoccurringUnit - Text - "Days", Weeks, Month, Ext

ReoccurringEveryX - Int - Reoccurring interval 

Thật thú vị, tôi thực sự đang khám phá một giải pháp khả thi tương tự như giải pháp này, tôi vẫn đang làm việc với các chức năng SQL của mình, tôi sẽ đăng nếu thành công
François Vespa ت

Thật thú vị, tôi đang cố gắng đưa ra truy vấn có thể tìm nạp cả các nhiệm vụ định kỳ và không định kỳ và sau đó sắp xếp chúng theo ngày Đến hạn của chúng. Có manh mối nào không?
Harshal Patil

2

Ngoài nhận xét từ S.Lott, Martin Fowler - Sự kiện định kỳ cho Lịch PDF có thể giúp bạn (tôi thấy nó hơi khó).

Cũng lưu ý rằng một số công cụ UI cung cấp chức năng mà bạn đang mô tả ngoài hộp (với mô hình tác vụ đơn giản). Tôi sẽ coi vấn đề này là một vấn đề khó giải quyết thiết kế cơ sở dữ liệu mà không có các công cụ như vậy.


1

Theo quan điểm của tôi, có hai lựa chọn:

  • Lưu trữ một lượng lớn các hàng bằng nhau cho các mục định kỳ, tuy nhiên chúng phải kết thúc (thông qua ngày kết thúc hoặc số lượng mục hữu hạn) và phải được đánh dấu là mục lặp lại. Khi bạn thay đổi sự kiện, bạn phải cập nhật tất cả, nhưng khi bạn muốn đi chệch một lần, bạn có thể chỉ cần 'ngắt' kết nối giữa một sự kiện và biến nó thành một sự kiện bình thường.
  • Lưu trữ sự kiện dưới dạng một mục lặp lại, với một sơ đồ lặp lại nhất định và tính toán cho một ngày nhất định trong đó các mục định kỳ là do vào ngày đã cho. Điều này cho khả năng lặp lại vô hạn.

đó cũng là cách tôi nhìn thấy nó
François Vespa ت

1

Nếu đây là một dự án cá nhân và bạn chỉ muốn một cách để lưu trữ các nhiệm vụ của mình, tôi khuyên bạn nên sử dụng TaskCoach . Đây là một ứng dụng máy tính để bàn, đa nền tảng, mã nguồn mở, dễ dàng bắt đầu và có các tính năng thực sự tốt.

Trong trường hợp bạn đang phát triển một ứng dụng tác vụ, thì cách khả thi nhất là thêm một hàng mới cho mỗi tác vụ định kỳ. Logic là mỗi tác vụ là một thực thể riêng biệt và nó phải được hoàn thành trước khi cùng một nhiệm vụ được bắt đầu vào ngày hôm sau. Nếu bạn chỉ tăng nó, bạn không thể nắm bắt được lịch sử của nhiệm vụ.

Trong trường hợp bạn cảm thấy, nó sẽ chỉ cung cấp cho bạn một danh sách lớn nếu một vài nhiệm vụ chưa hoàn thành thì bạn có thể kích hoạt một sự kiện sau khi nhiệm vụ định kỳ hoàn thành để nhiệm vụ mới được tạo thành một hàng mới chỉ khi nhiệm vụ được thực hiện đánh dấu là đã hoàn thành Theo đề xuất của Morons, bạn có thể sử dụng một bảng riêng có cờ cho các nhiệm vụ định kỳ trong bảng gốc cùng với dữ liệu để lặp lại (ngày, tuần, thời gian lặp lại) để bạn có thể có một tập lệnh đơn giản có thể tạo các tác vụ định kỳ dựa trên ngày hoặc một điều kiện hoặc bằng nhãn.

Nhưng nếu bạn chắc chắn rằng tác vụ là một nhiệm vụ chắc chắn lặp đi lặp lại mà không có bất kỳ thay đổi nào (chẳng hạn như bàn chải hàng ngày) và không cần theo dõi rộng rãi, thì bạn có thể thử cấu trúc sau

  • Cờ lặp lại - để chỉ ra rằng nhiệm vụ đang lặp lại
  • Định kỳ - ngày, tuần, tháng
  • Số lượng tác vụ được tạo - Điều này sẽ tăng nhiệm vụ dựa trên thời gian lặp lại. Vì vậy, nếu nhiệm vụ bắt đầu hôm nay và có thời gian tái diễn là một ngày, nó sẽ chỉ tăng thêm một ngày mai
  • Số lượng nhiệm vụ đã hoàn thành - Điều này sẽ tăng lên nếu nhiệm vụ được hoàn thành

Logic là sự khác biệt giữa các nhiệm vụ đã hoàn thành và các nhiệm vụ được tạo phải luôn là khoảng thời gian lặp lại nếu nhiệm vụ luôn hoàn thành. Vì vậy, việc phân chia sự khác biệt của các ngày theo thời gian tái phát sẽ cho bạn một dấu hiệu về việc nhiệm vụ đã chờ xử lý trong bao lâu.

Cảm ơn Kareem đã chỉ ra điều này

IMHO, các ứng dụng nhiệm vụ rất khó để xây dựng cho mọi người nói chung.


cảm ơn câu trả lời mang tính xây dựng! đây là một dự án cho vui và tôi muốn làm cho nó linh hoạt nhất có thể, với các truy vấn như 'được lặp lại sau mỗi 4 ngày trừ khi đó là thứ tư'
François Vespa ت

1

Cho đến nay, hoạt động thường xuyên nhất sẽ là liệt kê tất cả các sự kiện xảy ra trong một khoảng thời gian. Vì vậy, tối ưu hóa dữ liệu của bạn để câu hỏi có thể được trả lời bằng một truy vấn SQL đơn giản. Tôi sẽ tạo hai bảng:

CREATE TABLE events(start TIMESTAMP, end TIMESTAMP, name TEXT, user_id LONG,
                    recurrence_id LONG, ...);
CREATE TABLE recurrences(id LONG, start TIMESTAMP, end TIMESTAMP, name TEXT, 
                         frequency ...);

Lập chỉ mục bảng sự kiện theo thời gian bắt đầu và kết thúc. Sau đó, tất cả các truy vấn có thể được trả lời từ bảng sự kiện rất nhanh. Khi một lần lặp lại được chỉnh sửa, chỉ cần xóa và tạo lại tất cả các sự kiện tương ứng.

Lời khuyên này được lặp đi lặp lại một cách đáng xấu hổ từ một cuốn sách của Tom Kite.


1

Nhiệm vụ lặp đi lặp lại nên có ngày bắt đầu và ngày kết thúc. Đối với một nhiệm vụ ngày duy nhất họ sẽ là cùng một ngày.

Tạo một số loại bảng "Ngày" có một bản ghi cho mỗi ngày mà bạn nghĩ là có liên quan từ khi bắt đầu nhu cầu của bạn trong tương lai như bạn muốn: ví dụ: 31/12/2100 và chuyển đổi sang định dạng của bạn.

Một truy vấn có thể trông giống như:

Select 
  t.id
  , t.label
  , d.UnixDate
from Tasks as t
inner join Dates as d
on d.UnixDate >= t.StartDate
  and d.UnixDate <= t.EndDate
where t.id = [ID Param]

0

Tôi đã thực hiện một số thứ tương tự cách đây nhiều năm khi thực hiện một giao diện như Windows Task Lập lịch và về cơ bản cho từng tác vụ bạn có StartDate, EndDate (có thể là null), StartTime và RecurringDays có chứa các ngày trong tuần khi tác vụ phải được lên lịch.


Nó thật thú vị. có một số giới hạn thiết kế, tức là các truy vấn không thể thực hiện được (như 'được lặp lại mỗi ngày trong tuần')?
François Vespa ت

0

Bạn có thể sử dụng hai bảng: một bảng để mô tả các tác vụ, bảng còn lại cho trạng thái của chúng (đã hoàn thành / chưa hoàn thành và các thông tin khác: thời gian sử dụng, trạng thái thoát, vị trí của tệp nhật ký, v.v.) Bảng mô tả sẽ chứa Tên của tác vụ và ngày hoặc tần suất cần chạy: sẽ chỉ có một hàng cho mỗi tác vụ. Mỗi ngày, một quy trình sẽ điền vào bảng trạng thái cho các nhiệm vụ cần thực hiện hôm nay, từ bảng mô tả (bạn có thể nhập trước một tuần hoặc một tháng).

Tạo bảng trạng thái theo chương trình cung cấp cho bạn tất cả sự linh hoạt mà bạn muốn cho tần suất (ví dụ: "mỗi ngày trong tuần trừ ngày lễ ngân hàng cho quốc gia X" - thậm chí có thể được lưu trữ dưới dạng chuỗi). Có một bảng trạng thái cho phép bạn kiểm tra xem hoặc tần suất các tác vụ thất bại (ví dụ: "Tôi phải chạy mỗi ngày: tôi có thường xuyên có thời gian để thực hiện không?").

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.