đặt vấn đề này sang một bên và sẽ quay trở lại trong các phần sau.3 CSDL Nhà cung cấp & Mặt hàng (Phiên bản thời gian hoá toàn phần thứ nhất, Sử dụng các nhãn thời gian) S_FROM_TO: U S# TENCONGTY TRANGTHAI DIACHI FROM TO U U U S1 VinhTrinh 20 HaNoi d04 d10 S2 CMC 10 SaiGon d07 d10 S2 CMC 10 SaiGon d02 d04 S3 HaiAn 30 SaiGon d03 d10 S4 VinaComm 20 HaNoi d04 d10 S5 Hanel 30 DaNang d02 d10 Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.com - 20 - SP_FROM_TO: U S# U U P# U U FROM TO U S1 P1 d04 d10 S1 P2 d05 d10 S1 P3 d09 d10 S1 P4 d05 d10 S1 P5 d04 d10 S1 P6 d06 d10 S2 P1 d02 d04 S2 P2 d03 d03 S2 P1 d08 d10 S2 P2 d09 d10 S3 P2 d08 d10 S4 P2 d06 d09 S4 P4 d04 d08 S4 P5 d05 d10 CSDL thời gian của Bảng 1.3 bao gồm toàn bộ mọi thông tin từ CSDL bán thời gian trong Bảng 1.2, cùng với những thông tin mang tính lịch sử liên quan đến thời kỳ trƣớc (từ ngày d02 đến d04) trong khoảng đó nhà cung cấp S2 đƣợc ký kết chính thức. Tân từ đối với S_FROM_TO là “Nhà cung cấp S# đƣợc đặt tên là TENCONGTY, có trạng thái là TRANGTHAI, đóng tại thành phố DIACHI,đã ký hợp đồng chính thức, từ ngày FROM (không phải ngay ngày trƣớc ngày FROM) tới ngày TO (không phải ngày ngay sau TO)”. Tân từ đối với SP_FROM_TO là tƣơng tự. Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.1 – Ràng buộc Trƣớc hết chúng ta tránh trƣờng hợp ngớ ngẩn là thời điểm TO đứng trƣớc thời điểm FROM trong cặp FROM_TO: CONSTRAINT S_FROM_TO_OK IS_EMPTY (S_FROM_TO WHERE TO < FROM); CONSTRAINT SP_FROM_TO_OK IS_EMPTY (SP_FROM_TO WHERE TO < FROM); Tiếp theo ta nhận thấy trong Bảng 1.3 có thêm thuộc tính FROM đƣợc gạch chân mà chúng ta thêm vào trong khoá chính của cả S_FROM_TO và SP_FROM_TO; ví dụ khoá chính của S_FROM_TO hiển nhiên không chỉ là {S#}, bởi vậy chúng ta không thể có cùng một nhà cung cấp đƣợc ký kết lại có nhiều hơn một giai đoạn liên tục.
Áp dụng tƣơng tự cho SP_FROM_TO. Chú ý: Ta có thể sử dụng các thuộc tính TO thay cho thuộc tính FROM; thực tế cả hai bảng S_FROM_TO và SP_FROM_TO đều có hai khoá dự tuyển là các ví dụ tốt về biến quan hệ mà với chúng hiển nhiên là không có lý do gì để chọn một trong những khóa đó làm khoá chính. Chúng ta thực hiện việc chọn lựa chỉ thuần tuý để đƣợc sự xác định rõ. Tuy nhiên những khoá chính đó không tự nó nắm bắt đƣợc mọi ràng buộc nhƣ ta mong muốn.
Ví dụ khi xem xet biến quan hệ S_FROM_TO. Rõ ràng là nếu có một bộ cho nhà cung cấp Sx trong đó biến quan hệ với giá trị FROM là f và TO có giá trị là t, khi đó ta muốn không có một bộ cho nhà cung cấp Sx nào trong biến quan hệ đó chỉ ra rằng Sx đã đƣợc ký chính thức vào ngày ngay trƣớc ngày f hoặc ngay sau ngày t. Ví dụ giả sử nhà cung cấp S1, với nhà cung cấp đó ta chỉ có một bộ S_FROM_TO, với FROM = d04 và TO = d10. Thực tế chỉ {S#, FROM} là khoá chính cho biến quan hệ đó thì hiển nhiên không đủ để ngăn chặn sự xuất hiện của một bộ giá trị S1 “trùng lặp thêm” (“additional -overlaping”) với FROM = d02 và TO = d06 chỉ ra trong số những điều khác rằng S1 đƣợc ký kết chính thức vào ngày ngay trƣớc ngày d04.
Rõ ràng điều mà ta mong muốn là với hai bộ giá trị của S1 này có thể hợp nhất đƣợc lại thành một bộ giá trị với FROM = d02 và TO = d10. Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.com - 22 - Do đó ràng buộc ở đây là chặn những điểm lặp và tiếp giáp đó: CONSTRAINT AUG_S_FROM_TO_PK IS_EMPTY (((S_FROM_TO RENAME FROM AS F1, TO AS T1) JOIN S_FROM_TO RENAME FROM AS F2, TO AS T2)) WHERE (T1 ≥ F2 AND T2 ≥ F1)) OR (F2 = T1+1 OR F1 = T2+1)); Biểu thức này là khá phức tạp, không đề cập đến cách viết tổng quát, ví dụ “T1+1” là một ngày ngay sau ngày đƣợc biểu diễn bởi T1, vấn đề này ta sẽ quay trở lại sau trong Phần 1. Tiếp theo, chú ý rằng tổ hợp các thuộc tính {S#, FROM} trong biến quan hệ SP_FROM_TO không phải là một khoá ngoài từ SP_FROM_TO tới S_FROM_TO (cho dù nó bao gồm những thuộc tính giống nhau, S# và FROM, tƣơng tự khoá chính của S_FROM_TO). Tuy nhiên, chúng ta cần chắc chắn rằng nếu một nhà cung cấp nào đó xuất hiện trong SP_FROM_TO, thì cũng nhà cung cấp đó sẽ xuất hiện trong S_FROM_TO: CONSTRAINT AUG_SP_TO_S_FK_AGAIN1 SP_FROM_TO {S#} S_FROM_TO {S#}; Nhƣng ràng buộc AUG_SP_TO_S_FK_AGAIN1 bản thân nó không đầy đủ, ta cũng cần phải chắc chắn rằng (thậm chí nếu mọi mong muốn kết hợp các bộ dữ liệu đã đƣợc thực hiện) nếu SP_FROM_TO chỉ ra một vài nhà cung cấp có khả năng cung cấp một số mặt hàng trong một số khoảng thời gian, thì S_FROM_TO chỉ ra rằng cũng nhà cung cấp đó phải đƣợc ký kết hợp đồng trong cùng khoảng thời gian.
Ta sẽ thử nhƣ sau: CONSTRAINT AUG_SP_TO_S_FK_AGAIN2 /* chưa chính xác! */ IS_EMPTY ((S_FROM_TO RENAME FROM AS SF, TO AS ST) JOIN (SP_FROM_TO RENAME FROM AS SPF, TO AS SPT)) WHERE SPF < SF OR SPT > ST); Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.com - 23 - Tuy nhiên đặc tả này thực tế là không chính xác. Để hiểu rõ tại sao, cho S_FROM_TO nhƣ mô tả trong Bảng 1.3, và cho S_PFROM_TO bao gồm một bộ giá trị của nhà cung cấp S2 với FROM = d03 và TO = d04. Sự sắp xếp đó rõ ràng là phù hợp, khi đó ràng buộc AUG_SP_TO_S_FK_AGAIN2 giống nhƣ một phép chặn thực sự trạng thái. Chúng ta sẽ không giải quyết vấn đề này ở đây mà sẽ xem xét trong phần sau (Ràng buộc trên khoảng).
Tuy nhiên ta nhận thấy giống nhƣ nội dung của một thuật ngữ mà nếu (nhƣ chú ý ở phần trƣớc) sự kết hợp thuộc tính {S#,FROM,TO} trong biến quan hệ S_FROM_TO đƣợc xem nhƣ một “khóa dự tuyển thời gian” , khi đó tổ hợp các thuộc tính {S#,FROM,TO} trong biến quan hệ SP_FROM_TO đƣợc xem là “khóa ngoài thời gian” (cho dù thực tế nó không phải là một khóa ngoài nhƣ vậy).2 – Truy vấn: Các phiên bản “thời gian hóa toàn phần” của truy vấn 1.2 là: Truy vấn 3.1: Cho S#-FROM-TO là bộ ba giá trị của những nhà cung cấp có U U khả năng cung cấp một số mặt hàng vào một số thời điểm nào đó, trong đó FROM và TO cùng chỉ rõ một khoảng liên tục tối đa trong đó nhà cung cấp S# thực tế đã có khả năng cung cấp một số mặt hàng. Chú ý: Chúng ta sử dụng thuật ngữ “tối đại” (maximal) ở đây nhƣ một giải thích ngắn gọn thuận tiện hàm ý (trong trƣờng hợp sắp tới) rằng nhà cung cấp S# đã không thể cung cấp bất kỳ mặt hàng nào vào ngày ngay trƣớc ngày FROM và ngay sau ngày TO.2: Cho S#-FROM-TO là bộ ba giá trị của những nhà cung cấp U U không có khả năng cung cấp bất kỳ mặt hàng tại mọi thời điểm, trong đó FROM và TO cùng chỉ rõ một khoảng liên tục tối đại trong đó nhà cung cấp S# thực tế đã không có khả năng cung cấp bất kỳ mặt hàng nào. Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.com - 24 - Vấn đề của dữ liệu có yếu tố thời gian là nó nhanh chóng dẫn đến các ràng buộc và truy vấn mà đều trong tình trạng quá phức tạp trừ khi hệ thống có thể cung cấp những phƣơng pháp ngắn gọn đƣợc thiết kế tốt, tất nhiên nhƣ chúng ta biết với hệ thống những sản phẩm thƣơng mại ngày nay thì lại không thể.4- BIỂU DIỄN YẾU TỐ THỜI GIAN TRONG CSDL THỜI GIAN.1- Khoảng thời gian Chúng ta sẽ bắt đầu sự phát triển về một tập hợp thích hợp ngắn ngọn. Bƣớc đầu tiên và cơ bản nhất là thừa nhận sự cần thiết phải đề cập tới các khoảng (Intervals) một cách đúng đắn, thay vì chỉ xem chúng nhƣ là những cặp giá trị độc lập nhƣ chúng ta đã thực hiện ở các phần trƣớc.
Vậy chính xác một khoảng là gì? Căn cứ vào Bảng 1.3, nhà cung cấp S1 đã có thể cung cấp mặt hàng P1 trong suốt khoảng từ ngày 04 đến ngày 10. Nhƣng “từ ngày 04 đến ngày 10” có nghĩa là gì? Chắc chắn là nó bao gồm ngày 5,6,7,8 và 9, vậy còn điểm đầu và điểm cuối, ngày 4 và 10 thì sao? Điều đó chỉ ra rằng: cho trƣớc một khoảng xác định, đôi khi ta thấy điểm đầu và điểm cuối là bao gồm trong khoảng nhƣng đôi khi thì không phải vậy. Nếu khoảng từ ngày 4 đến ngày 10 có bao gồm ngày 4, ta gọi đó là khoảng đóng tại điểm đầu, trƣờng hợp ngƣợc lại ta gọi khoảng là mở tại điểm đầu. Cũng tƣơng tự vậy nếu khoảng bao gồm cả ngày 10 ta gọi là khoảng đóng tại điểm cuối, ngƣợc lại ta gọi là khoảng mở tại điểm cuối.
Ta quy ƣớc cách chỉ rõ một khoảng bởi điểm đầu và điểm cuối của nó (theo trật tự đó) nhƣ sau: ký hiệu dấu “ [ “ cho khoảng đóng và “(“ cho khoảng mở. Do đó có 4 cách khác nhau để biểu diễn một khoảng xác định từ ngày 4 tới ngày 10 bao gồm cả ngày 4 và ngày 10: [d04, d10] [d04, d11) (d03, d10] (d03, d11) Cơ sở dữ liệu thời gian TIEU LUAN MOI download : skknchat@gmail.com - 25 - Chú ý: Thực tế kiểu đóng [.] thƣờng đƣợc sử dụng nhiều hơn cả, và ta cũng dùng kiểu này trong các biểu diễn tiếp theo. Cho trƣớc khoảng [d04, d10] là những giá trị trong thứ tự đúng của nó; Việc tổ hợp các thuộc tính FROM và TO của SP_FROM_TO (trong Bảng 1.3) thành một thuộc tính đơn, DURING, những giá trị của chúng đƣợc rút ra từ một kiểu khoảng nào đó là có ý nghĩa. Ƣu điểm ngay lập tức của ý tƣởng này là tránh đƣợc một sự lựa chọn tuỳ hứng cần thiết nhƣ là lựa chọn khoá nào làm khoá chính trong các khoá {S#,FROM} và {S#,TO}.
Một ƣu điểm khác là nó cũng tránh đƣợc điều cần thiết phải quyết định: liệu các khoảng FROM –TO trong Bảng 1.3 đƣợc lý giải là đóng hay mở đối với mỗi giá trị FROM và TO; thực tế [d04, d10], [d4, d11), (d03, d10] và (d03, d11) bây giờ trở thành 4 cách biểu diễn khác nhau có thể có của cùng một khoảng và chúng ta không cần thiết phải biết đâu là cách biểu diễn thực sự.