2008-12-23 16 views
6

Hiện tại, tôi đang làm việc trên một dự án để quản lý cửa sổ bảo trì trên cơ sở dữ liệu máy chủ, v.v. Về cơ bản, tôi chỉ cần chính xác đến giờ, nhưng cho phép chúng được đặt thành cho phép hoặc không cho phép mỗi ngày trong tuần.Lịch hàng tuần - Bạn có thể lưu trữ điều này trong cơ sở dữ liệu bằng cách nào?

Tôi đã có một vài ý tưởng về cách thực hiện việc này, nhưng vì tôi tự làm việc, tôi không muốn cam kết với bất kỳ điều gì mà không có một số phản hồi.

Để hình dung này, đó là một cái gì đó giống như chảy "đồ thị"

| Sun | Mon | Tue | Wed | Thu | Fri | Sat | 
    ------------------------------------------- 
5AM |allow|allow|allow|deny |deny |allow|allow| 
    ------------------------------------------- 
6AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
7AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
8AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
9AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
... etc... 

Có một cách tiêu chuẩn để làm điều này hoặc một nguồn tài nguyên có thể cho tôi một số ý tưởng để ...

  1. Tạo một định dạng có thể được lưu và khôi phục dễ dàng
  2. Làm cho nó có thể tìm kiếm trong cơ sở dữ liệu (ví dụ: không phải deserialize nó để tìm kiếm một thời gian)

[Cập nhật]

Điều đáng nói rằng một ngày nào đó, mặc dù không chắc, được thiết lập để "cho phép, từ chối, cho phép, từ chối ... vv ...". Khoảng không được đảm bảo là người duy nhất trong cả ngày.

Đây cũng không phải là lịch trình duy nhất, sẽ có hàng trăm thiết bị với lịch biểu của riêng mình, vì vậy nó sẽ nhận được lông ... lol ??

Rob hỏi xem mỗi tuần có cần theo dõi không. Đây là một kế hoạch chung sẽ áp dụng cho cả năm (thường xuyên theo lịch bảo trì)

+0

Bạn cần phải theo dõi mỗi tuần trong năm, hoặc là này chỉ là một bảng cấu hình cho một tuần chung chung? –

+0

Có vẻ như với tôi bạn cần xoay bảng này, bởi vì nếu bạn muốn nhận được tất cả các giờ trong một ngày nhất định, bạn sẽ cần phải trả lại 24 hàng không có cách nào dễ dàng để CÓ dữ liệu. Nó có vẻ như với tôi có 7 hàng với 24 cột có ý nghĩa hơn, 1 hàng cung cấp cho bạn tất cả các giờ trong một ngày nhất định. – TravisO

+0

Ý tưởng thú vị Travis – Hugoware

Trả lời

0

Có lẽ cái gì đó như

TABLE: 
    StartTime DATETIME  PrimaryKey, 
    EndTime DATETIME  PrimaryKey, /*if you are positive it will be in one hour incerments then you might want to omit this one*/ 
    Monday BIT, 
    TuesDay BIT, 
    Wednesday BIT, 
    Thursday BIT, 
    Friday BIT, 
    Saturday BIT, 
    Sunday BIT 
8

tôi sẽ xem xét cho (1) sử dụng một định dạng bao gồm cả bắt đầu và thời gian kết thúc, và một trường số nguyên cho ngày trong tuần. Tôi biết bạn đã nói rằng các khối sẽ luôn là một giờ, nhưng điều đó có thể được thi hành bởi mã của bạn. Ngoài ra, nếu yêu cầu của bạn thay đổi một ngày, bạn sẽ có ít hơn rất nhiều để lo lắng về trong bước (2) hơn nếu báo cáo DB của bạn là tất cả bằng văn bản để giả sử khối 1 giờ.

CREATE TABLE maintWindow (
    maintWindowId int primary key auto_increment not null, 
    startTime  Time, 
    endTime  Time, 
    dayOfWeek  int, 
    ... 

Đối với (2), nếu mỗi bản ghi có một sự khởi đầu và kết thúc thời gian liên kết với nó, sau đó nó rất dễ dàng để kiểm tra các cửa sổ cho bất kỳ thời điểm nào:

SELECT maintWindowId 
FROM maintWindow 
WHERE $time >= TIME(startTime) AND $time <= TIME(endTime) AND DAYOFWEEK($time) = dayOfWeek 

(nơi $time đại diện cho ngày và thời gian bạn muốn kiểm tra).

Việc cho phép hoặc không cho phép mỗi ngày trong tuần sẽ được xử lý bằng các bản ghi riêng biệt. IMHO, điều này linh hoạt hơn mã hóa cứng cho mỗi ngày trong tuần, vì sau đó bạn sẽ sử dụng một loại tuyên bố trường hợp nào đó hoặc nếu người khác chuyển sang kiểm tra cột DB bên phải cho ngày bạn quan tâm.

Lưu ý: Đảm bảo bạn biết DB nào tiêu chuẩn sử dụng cho ngày nguyên trong tuần và cố gắng làm cho mã của bạn độc lập với nó (luôn hỏi DB). Chúng tôi đã có rất nhiều niềm vui với các tiêu chuẩn khác nhau cho đầu tuần (Chủ Nhật hoặc Thứ Hai) và chỉ số bắt đầu (0 hoặc 1).

+1

Đây chắc chắn là cách tiếp cận tôi sẽ sử dụng. –

1

Nếu nó sẽ khác nhau mỗi tuần, sau đó thiết lập bảng như thế này;

TABLE: 
    StartTime DATETIME PrimaryKey 

Nếu thời gian bắt đầu cho một ngày/giờ cụ thể được đặt, giả sử rằng nó được phép, nếu không thì sẽ từ chối.

Nếu đó là cấu hình chung cho một tuần chung chung không thay đổi, hãy thử điều này;

TABLE: 
    Hour INT, 
    Day INT, 
    Allow BIT 

Sau đó thêm hàng cho mỗi giờ/ngày kết hợp.

1

Tôi đã thực sự sử dụng thiết kế này trước đây, về cơ bản tạo bitmap cho khoảng thời gian bạn muốn thường xuyên lên lịch chia cho số lượng khoảng thời gian bạn muốn. Vì vậy, trong ví dụ của bạn, bạn muốn có một lịch trình hàng tuần với các khoảng thời gian theo giờ, do đó bạn sẽ có bitmap bitmap dài tới 21 byte. Một vài datetimes là 16 byte với nhau và bạn sẽ cần nhiều hàng trong số này để đại diện cho các lịch trình có thể cho một tuần nhất định vì vậy nếu bạn quan tâm về kích thước, tôi không nghĩ rằng bạn có thể đánh bại nó.

Tôi sẽ thừa nhận việc xử lý và ít linh hoạt hơn các đề xuất trước đây sẽ phức tạp hơn một chút. Hãy xem xét nếu bạn đột nhiên muốn sử dụng khoảng thời gian 1/2 giờ, bạn sẽ cần chuyển mã tất cả dữ liệu hiện có của mình sang bitmap bit 336 bit mới và phân phối các giá trị.

Nếu bạn đang sử dụng SQL, bạn có thể lưu trữ này dưới dạng blog nhị phân và thực hiện bit twiddling để so sánh xem một chút là tự bật hay tắt hoặc bạn có thể lưu trữ từng bit dưới dạng cột. MS SQL Server hỗ trợ lên đến 1024 cho tiêu chuẩn hoặc 30k cho bảng rộng, do đó bạn có thể dễ dàng có được chi tiết xuống đến 10 phút cho một hoặc một thỏa thuận tuyệt vời hơn cho một bảng 30k.

Tôi hy vọng điều này sẽ bổ sung thêm một góc nhìn khác về cách thực hiện. Nó thực sự chỉ cần thiết nếu bạn đang lo lắng về không gian/kích thước hoặc nếu bạn có lẽ 10 hoặc 100 của hàng triệu người trong số họ.

1

Bạn có thể dễ dàng ghi lại thời gian "được phép" trong bảng. Bằng cách đó, nếu nó không có ở đó, nó không được phép. Nếu bạn cần có "lịch biểu" biến hơn, bạn có thể dễ dàng thêm trường năm và tháng.

TABLE DBMaintSched 
     ID int PK 
     ServerID varchar(30) (indexed) 
     Day int 
     Month char(3) 
     DayOfWeek char(3) 
     Year int 
     StartDT DateTime 
     EndDT DateTime 

Đối với tháng Mười Hai, 2008:

SELECT * FROM DBMaintSched WHERE ServerID = 'SQLSERVER01' AND Month = 'DEC' AND Year = 2008 ORDER BY DAY ASC 

Bạn có tất cả các ngày cho tháng 12 năm 2008 mà bảo trì có thể được thực hiện. Hiển thị tuy nhiên bạn muốn.

1

Mọi giải pháp được đề xuất đều tốt cho tôi, dù sao tôi cũng sẽ xem xét giải pháp này nếu bạn gặp phải vấn đề về hiệu suất và/hoặc kích thước bảng. Vì bạn có thể tạo mối quan hệ giữa thời gian và thực thể của bạn (tức là máy chủ), kích thước sẽ tăng theo entity_number * entity_times. Nếu bạn có một hàng cho mỗi timespan này có thể là một nỗi đau.

Đề xuất này hơi xấu xí về cấu trúc bảng nhưng hiệu quả hơn khi nói đến dung lượng đĩa và tốc độ quét bảng.

TABLE times 
    entityFK int -- your entity foreign key 
    day INT  -- 0-7 day identifier 
    bit time0 -- ON if the time 00:00 - 00:59 is being covered 
    bit time1 
    bit time2 
    -- more columns 
    bit time23 

xem xét ví dụ mà bạn muốn gán 16:00-20:00 thời gian hoạt động đến một máy chủ vào chủ nhật và thứ hai, bạn sẽ chỉ có hai hàng như

entityFK | day | time16 | time17 | time18 | time19 | -- other bits are set to 0 
server1 0  1  1  1  1 
server1 1  1  1  1  1 

Bạn sẽ giả định rằng tất cả các hàng bị thiếu nghĩa là máy chủ bị hỏng.

Nếu bạn cần điều này, bạn có thể xem xét sử dụng định dạng DATE cho cột ngày để đặt ngày cụ thể (tức là thời gian hoạt động chỉ 2013/10/02 từ 16:00 đến 20:00).

Hy vọng nó giúp

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