TU 1.4.3- Các toán tử gộp nhập trên khoảng UT

Một phần của tài liệu Cơ sở dữ liệu thời gian (Trang 31 - 41)

và COALESCE. Mỗi toán tử này lấy một tập của các khoảng thuộc cùng một kiểu nhƣ một toán hạng đơn của nó và trả lại kết quả cũng là một tập khác nhƣ vậy. Có thể coi kết quả của cả hai trƣờng hợp nhƣ là một dạng chính tắc đối với tập gốc. Cho XB1B và XB2B lần lƣợt là tập hợp:

{[d01,d01],[d03,d05],[d04,d06]} và

{[d01,d01],[d03,d04],[d05,d05],[d05,d06]}

Dễ dàng nhận thẩy rằng XB1B không giống XB2B. Và cũng dễ nhận thấy là (a) tập hợp của mọi điểm p nằm trong một khoảng nào đó của XB1B là giống với (b) tập của mọi điểm p nằm trong một khoảng nào nó thuộc XB2B (những điểm mà ta đề cập ở đây là d01, d03, d04, d05 và d06). Tuy nhiên, chúng ta không quan tâm nhiều đến tập của các điểm đó nhƣ vậy mà sẽ xem xét tập tƣơng ứng của các khoảng đơn vị (ta gọi là XB3B):

{ [d01,d01], [d03,d03], [d04,d04 ], [d05,d05 ], [d06,d06 ] } XB3B đƣợc gọi là ở dạng trải mở (unfolded) của XB1B và XB2B.

Định nghĩa [2] (Dạng trải mở): Nếu X là một tập các khoảng có cùng chung một kiểu, thì dạng trải mở của X là một tập của tất cả các khoảng có dạng [p, p] trong đó p là một điểm trong một khoảng nào đó thuộc X.

Chú ý rằng trong ví dụ này XB1B, XB2B và XB3B là khác nhau về lực lƣợng. Điều tất nhiên là XB3B (ở dạng trải mở) là tập có nhiều lực lƣợng nhất, nhƣng cũng dễ dàng tìm đƣợc một tập XB4B có cùng dạng trải mở nhƣ XB1B mà có lực lƣợng nhỏ hơn XB3B. Ví dụ:

Ta cũng rất dễ tìm đƣợc một tập lý thú hơn nhiều– và cần thiết, duy nhất – XB5B mà có cùng dạng trải mở và có lực lƣợng nhỏ nhất có thể:

XB5B = { [d01,d01], [d03,d06 ] }

XB5B đƣợc gọi là dạng hợp kết (coalesced) của XB1B (và cũng là của XB2B, XB3B, và XB4B).

Định nghĩa (Dạng hợp kết [2]): Nếu X là một tập các khoảng có chung một kiểu, thì dạng hợp kết của X là một tập Y các khoảng có cùng chung một kiểu mà:

 X và Y có cùng dạng trải mở và

 Không có phần tử phân biệt iB1B và iB2B nào của Y mà iB1B MERGES iB2B là đúng.

Chú ý rằng rất nhiều tập riêng biệt có thể có dạng hợp kết giống nhau.

Định nghĩa (Toán tử một ngôi UNFOLD và COALESCE [2]): Cho X là một tập các khoảng kiểu INTERVAL(PT). Khi đó UNFOLD(X) sẽ trả về giá trị dạng trải mở của X, và COALESCE(X) sẽ trả về dạng hợp kết của X.

Chú ý: Ta sẽ phải nói thêm là dạng trải mở và hợp kết là những thuật ngữ phi chuẩn, thực tế không xuất hiện dƣới bất kỳ thuật ngữ dạng chuẩn nào cho những khái niệm đó, thậm chí cho dù những khái niệm nhƣ vậy tất nhiên là đã đƣợc bàn luận trong nhiều tài liệu, tạp chí.

1.4.4- Toán tử quan hệ trên các khoảng

Bây giờ ta sẽ quay trở lại truy vấn 3.1 và 3.2 trong Phần 1.3.3.2.2. Trƣớc tiên ta tập trung vào truy vấn 3.1. Truy vấn 4.1 là một phát biểu lại của truy vấn 3.1 với theo CSDL của Bảng 1.4:

Truy vấn 4.1: Tìm ra các cặp S# - DURING cho các nhà cung cấp có khả năng cung cấp một mặt hàng nào đó tại một thời điểm nào đó, trong đó

DURING chỉ rõ thời gian tối đa liên tục mà trong đó nhà cung cấp S# trong thực tế là có khả năng cung cấp một mặt hàng nào đó.

Hãy nhớ lại phiên bản trƣớc của truy vấn này, truy vấn 2.1 yêu cầu sử dụng phép gộp nhóm và gộp nhập (cụ thể hơn là, nó bao gồm toán tử SUMMARIZE). Do đó sẽ không lấy làm ngạc nhiên là truy vấn 4.1 cũng sẽ đỏi hỏi những toán tử nào đó có bản chất là gộp nhóm gộp nhập. Tuy nhiên ta sẽ tiếp cận vấn đề về phát biểu truy vấn này với từng bƣớc nhỏ mỗi lần. Trƣớc hết là:

WITH SP_DURING {S#, DURING} AS T1 :

Bƣớc này chỉ đơn giản là loại bỏ số hiệu mặt hàng. Do đó kết quả của nó - T1- có dạng nhƣ sau: US#U DURING S1 [d04, d10] S1 [d05, d10] S1 [d09, d10] S1 [d05, d10] S1 [d04, d10] S1 [d06, d10] S2 [d02, d04] S2 [d03, d03] S2 [d08, d10] S2 [d09, d10] S3 [d08, d10] S4 [d06, d09] S4 [d04, d08] S4 [d05, d10]

Chú ý là quan hệ này chứa thông tin dƣ thừa; ví dụ chúng ta đƣợc thông tin không dƣới 3 lần rằng nhà cung cấp S1 có thể cung cấp thứ gì đó vào ngày 6. Kết quả yêu cầu, loại bỏ đƣợc những dƣ thừa đó, là rõ ràng nhƣ sau:

US#U DURING S1 [d04, d10] S2 [d07, d10] S2 [d02, d04] S3 [d08, d10] S4 [d04, d10]

Ta gọi kết quả này là dạng hợp gộp của T1 trên DURING. Chú ý là giá trị

DURING với một nhà cung cấp cho trƣớc trong dạng hợp gộp này không nhất thiết phải tồn tại nhƣ một giá trị DURING tƣờng minh cho nhà cung cấp đó trong quan hệ

T1, và dạng hợp gộp là bắt nguồn từ đó (Ví dụ: nhà cung cấp S4).

Bây giờ, rốt cuộc ta sẽ tiến đến một điểm mà ta có thể đạt đƣợc dạng hợp gộp nhờ vào một biểu diễn đơn giản ở dạng:

T1 COALESCE DURING

Tuy nhiên, chúng ta cần xây dựng điểm đó dần dần. Nhận thấy trƣớc hết là chúng ta đã quen với thuật ngữ dạng hợp gộp trong hai đoạn trƣớc mang một ý nghĩa khác biệt một chút với cách ta đã sử dụng trong Phần 1.4.3 (Các toán tử gộp nhập trên khoảng). Toán tử COALESCE nhƣ đã định nghĩa trong phần trƣớc đó nhận một tập các khoảng là đầu vào và sinh ra một tập các khoảng nhƣ là đầu ra. Tuy nhiên ở đây chúng ta đang nói về một phiên bản khác của toán tử đó mà nó nhận một quan hệ một ngôi là đầu vào và cho đầu ra là quan hệ một ngôi khác (cùng có mô tả giống nhau), và đó là các bộ trong những quan hệ chứa các khoảng thực sự. (adsbygoogle = window.adsbygoogle || []).push({});

Do đó các bƣớc đƣa ta từ T1 tới RESULT là:

Toán tử GROUP đƣợc sử dụng ở đây để “ghép” (nest) giá trị DURING với giá trị S#, số hiệu mỗi nhà cung cấp đƣợc ghép cặp với một tập các khoảng thay vì với một khoảng đơn. T2 có dạng sau: US#U X S1 UDURINGU [d04, d10] [d05, d10] [d09, d10] [d06, d10] S2 UDURINGU [d02, d04] [d03, d03] [d08, d10] [d09, d10] S3 UDURINGU [d08, d10] S4 UDURINGU [d06, d10] [d04, d08] [d05, d10]

Bây giờ ta sẽ áp dụng phiên bản mới của COALESCE cho các quan hệ mà chúng là giá trị của thuộc tính X lấy giá trị quan hệ:

T3 có dạng sau: US#U X S1 UDURINGU [d04, d10] S2 UDURINGU [d02, d04] [d08, d10] S3 UDURINGU [d08, d10] US4U UDURINGU [d04, d10] Cuối cùng chúng ta tách nhóm: T3 UNGROUP Y

Biểu thức này sinh ra quan hệ trƣớc đó ta gọi là RESULT. Hay nói cách khác, nó đồng thời chỉ ra tất các các bƣớc (và làm đơn giản hoá một chút), RESULT là kết quả của việc định giá toàn bộ biểu thức sau:

WITH SP_DURING {S#, DURING} AS T1, (T1 GROUP (DURING) AS X) AS T2,

(EXTEND T2 ADD COALESCE (X) AS Y) {ALL BUT X} AS T3 :

T3 UNGROUP Y

Điều hiển nhiên là ta muốn có thể có từ T1 đến RESULT trong một toán tử đơn. Cuối cùng ta phát biểu một “toán tử COALESCE” mới có cú pháp nhƣ sau:

R COALESCE A

(trong đó R là một biểu thức quan hệ và A là một thuộc tính - của một kiểu khoảng nào đó - của quan hệ đƣợc ký hiệu bởi biểu thức đó). Ngữ nghĩa của toán tử này đƣợc xác định bởi sự tổng quát hoá một cách hiển nhiên những toán tử nhóm (grouping), mở rộng (extension), chiếu (projection) và tách (ungrouping ) do đó ta

có đƣợc RESULT từ T1. Chú ý: Nó có thể giúp ta xác quan sát thấy hợp nhất (coalescing) R trên A bao gồm việc nhóm R bằng mọi thuộc tính của R khác với A (tƣơng tự, ví dụ biểu thức “T1GROUP(DURING)….” có thể đƣợc đọc là “ nhóm T1

theo S#, S# là thuộc tính duy nhất của T1 không đƣợc đề cập đến trong mệnh đề

GROUP).

Gộp mọi vấn đề đã đề cập ở trên cùng với nhau, bây giờ chúng ta có thể đƣa ra một phát biểu đơn giản hợp lý của truy vấn 4.1 nhƣ sau:

SP_DURING { S#, DURING } COALESCE DURING

Chú ý: Toàn bộ phép toán đƣợc biểu diễn bởi biểu thức này là một ví dụ về điều một vài tác giả gọi là phép chiếu thời gian (temporal projection). Cụ thể hơn, nó là một phép chiếu của SP_DURING trên S# và DURING. (Xem lại phiên bản gốc của truy vấn này, truy vấn 1.1 bao gồm phép chiếu thông thƣờng của SP trên S#). Nhận thấy rằng phép chiếu thời gian không phải là một phép chiếu đúng nhƣ vậy mà nó là một “tƣơng tự thời gian – temporalanalog” của một phép chiếu thông thƣờng.

Bây giờ ta chuyển sang truy vấn 3.2, truy vấn 4.2 là một phát biểu lại của truy vấn đó theo CSDL của Bảng 1.4:

Truy vấn 4.2: Tìm ra các cặp S# - DURING đối với các nhà cung cấp không có khả năng cung cấp bất kỳ mặt hàng nào tại một thời điểm nào đó, trong đó

DURING chỉ rõ thời gian liên tục tối đa mà trong khoảng thời gian đó nhà cung cấp S# trong thực tế là không có khả năng cung cấp bất kỳ mặt hàng nào.

Xem lại phiên bản gốc của truy vấn này, truy vấn 1.2 bao gồm một toán tử hiệu quan hệ. “Hiệu thời gian” (giống toán tử hiệu thông thƣờng) bao gồm hai toán hạng quan hệ. Ta tập trung vào toán hạng bên trái trƣớc. Nếu ta trải mở kết quả của phép chiếu (thông thƣờng) S_DURING{S#, DURING} trên DURING, ta có đƣợc một quan hệ - gọi là T1 – có dạng sau:

US#U DURING S1 [d04, d04] S1 [d05, d05] S1 [d06, d06] S1 [d07, d07] S1 [d08, d08] S1 [d09, d09] S1 [d10, d10] S2 [d07, d07] S2 [d08, d08] S2 [d09, d09] S2 [d10, d10] S2 [d02, d02] S2 [d03, d03] S2 [d04, d04] S3 [d03, d03] .... …………

Cho trƣớc dữ liệu mẫu của Bảng 1.4, T1 thực sự bao gồm tổng số 23 bộ giá trị. Nếu ta định nghĩa một phiên bản “quan hệ một ngôi” của UNFOLD (tƣơng tự với phiên bản “quan hệ một ngôi” của COALESCE), khi đó ta sẽ có T1 nhƣ sau:

(EXTEND (S_DURING {S#,DURING} GROUP (DURING) AS X) ADD UNFOLD (X) AS Y) {ALL BUT X} UNGROUP Y

Tuy nhiên nhƣ đã đề xuất, ta có thể đơn giản hoá vấn đề bằng cách sáng chể ra một toán tử “trải mở quan hệ” (relation unfold) với cú pháp nhƣ sau (và ngữ nghĩa rõ ràng):

R UNFOLD A

WITH (S_DURING {S#, DURING} UNFOLD DURING) AS T1 :

Ta xử lý toán hạng bên phải của hiệu thời gian nhƣ sau:

WITH (SP_DURING {S#, DURING} UNFOLD DURING) AS T2 :

Bây giờ ta có thể áp dụng phép hiệu quan hệ : (adsbygoogle = window.adsbygoogle || []).push({});

WITH (T1 MINUS T2) AS T3 : T3 sẽ có dạng: US#U DURING S2 [d07, d07] S3 [d03, d03] S3 [d04, d04] S3 [d05, d05] S3 [d06, d06] S3 [d07, d07] S5 [d02, d02] S5 [d03, d03] S5 [d04, d04] S5 [d05, d05] S5 [d06, d06] S5 [d07, d07] S5 [d08, d08] S5 [d09, d09] S5 [d10, d10]

Cuối cùng, ta hợp nhất T3 trên DURING để có kết quả mong muốn là:

T3 COALESCE DURING Kết quả sẽ nhƣ sau: S# DURING S2 [d07, d07] S3 [d03, d07] S5 [d02, d10]

Và phát biểu của truy vấn 4.2 là một biểu thức lồng nhƣ sau:

((S_DURING {S#, DURING} UNFOLD DURING)MINUS (SP_DURING UNFOLD DURING)) COALESCE DURING

Nhƣ đã chỉ rõ, toàn bộ phép toán đƣợc xác định bởi biểu thức này là một ví dụ về điều một vài tác giả gọi là phép hiệu thời gian. Cụ thể hơn, nó là một “phép hiệu thời gian” giữa các phép chiếu của S_DURING và SP_DURING lần lƣợt trên S# và

DURING. Chú ý rằng, giống phép chiếu thời gian, hiệu thời gian không đúng là một hiệu theo nghĩa thông thƣờng mà nó là một “tƣơng tự thời gian ” của một hiệu thông thƣờng.

Tuy nhiên chúng ta chƣa thực sự kết thúc ở đây. Biểu thức “hiệu thời gian” giống nhƣ đã chỉ ra trong ví dụ đỏi hỏi phải đƣợc thực hiện rất thƣờng xuyên cần phải xác định một cách ngắn gọn hơn cho chúng. Cụ thể là, cần có một toán tử đơn nắm bắt đƣợc trình tự (a) trải mở cả hai toán hạng, (b) tìm hiệu, và sau đó (c) hợp nhất. Đề xuất ngắn gọn của chúng tôi là:

R1 I_MINUS R2 ON A

R1 và R2 là những biểu thức quan hệ biểu diễn quan hệ rB1B và rB2B mà có cùng kiểu và A là một thuộc tính của kiểu khoảng nào đó là chung cho cả hai quan hệ (tất nhiên là tiếp đầu tố I viết tắt của interval (khoảng)).

Nhƣ ta đã thấy, biểu thức này đƣợc định nghĩa là tƣơng đƣơng về ngữ nghĩa nhƣ sau:

( (R1 UNFOLD A) MINUS (R2 UNFOLD A) ) COALESCE A

Ta có thể có các định nghĩa tƣơng tự cho những toán tử I_... nhƣ: I_UINION và I_INTERSECT.

Có một điểm hiệu năng quan trọng phải thực hiện trong liên kết với các toán tử nhƣ I_MINUS. Việc thực hiện trải mở cả hai toán hạng, tìm hiệu, sau đó là hợp nhất có thể mất quá nhiều thời gian và không gian. Có một vài phƣơng pháp hiệu quả hơn thế. Thực tế, ta có thể hy vọng rằng bộ tối ƣu hoá sẽ sử dung phƣơng pháp hiệu quả đối với I_MINUS ngay khi đặt vào đó một biểu thức dài dòng. Một lĩnh vực dành cho nghiên cứu thêm về một biểu thức khá phức tạp nhƣ sau:

(((R1 UNFOLD A) WHERE C) MINUS (R2 UNFOLD A)) COALESCE A

Trong đó C là một điều kiện bất kỳ. Nếu có thể chứng minh đƣợc nó tƣơng đƣơng về mặt logic với:

( R1 WHERE C ) I_MINUS R2 ON A

thì bộ tối ƣu hoá có thể thực hiện tốt nhằm xác định và thực hiện tối ƣu nó.

1.4.5- Ràng buộc trên các khoảng

Một phần của tài liệu Cơ sở dữ liệu thời gian (Trang 31 - 41)