Truy Xuất Csdl Sau Khi Nhập Vào Tất Cả Các Giá Trị


From NV

Where MaNV=$MaNV if #FOUND then

Update NV Set MAP = 12

Where MANV= „NV5‟;

else write (terminal, “Không tìm thấy”)

Ví dụ 2.25: Xét quan hệ toàn cục nhân viên trong ví dụ 2.23 với ứng dụng cập nhật mã phòng của nhân viên có mã nhân viên mà mã nhân viên và mã phòng ban được nhập từ thiết bị đầu cuối.

Read(terminal, $MANV,$MAP) Select *

From NV

Where MANV=$MANV if #FOUND then

Có thể bạn quan tâm!

Xem toàn bộ 312 trang tài liệu này.

Update NV

Set MAP = $MAP

Cơ sơ dữ liệu phân tán - 13

Where MANV=$MANV;

else write (terminal, “Không tìm thấy”)

2) Trong suốt vị trí

Người lập trình ứng dụng phải giải quyết tường minh với các mảnh.

Cấu trúc chương trình

- Bước 1: Nhận một tham số từ chương trình tựa- Pascal

Read(terminal, $iv1,…, $ivn)

- Bước 2: Truy xuất CSDL

Select fn1 Into $ov1,…., fnn Into $ovn

From Ri

Where

Trong đó:

+ fn1,….,fnn là tên các trường

+ Ri là mảnh thứ i nào đó

- Bước 3: Trả về kết quả như là một tham số

If #FOUND then

Insert into Rk (fn1,…., fnn) Values ($ov1,….,$ovn) Delete

From Ri


Where

else write (terminal, “Không tìm thấy”)

Ví dụ 2.26: Xét quan hệ toàn cục NV trong ví dụ 2.23

Select MANV, HOTEN,LUONG,THUE

Into $MANV, $HOTEN, $LUONG, $THUE

From NV1

Where MANV =‟NV5‟;

if #FOUND then begin

Select MAQL into $MAQL From NV2

Where MANV =‟NV5‟;

Insert into NV3(MANV, HOTEN, MAP) Values („NV5‟, $ HOTEN,12);

Insert into NV4 (MANV, LUONG, THUE, MAQL) Values („NV5‟, $SAL, $THUE, $MAQL);

Delete from NV1 Where MANV =‟NV5‟;

Delete from NV2 Where MANV =‟NV5‟;

End;

Hai lệnh select đầu tiên thu thập bộ Nv cần thiết từ các mảnh chứa nó, đó là mảnh NV1 và NV2. Hai lệnh insert sắp đặt lại bộ này theo một cách khác và đưa nó vào trong hai mảnh khác, đó là hai mảnh NV3, NV4. Hai lệnh delete xoá bản sao cũ của bộ này từ hai mảnh NV1 và NV2. Lưu ý rằng bốn lệnh cuối cùng có thể được thực hiện một cách song song hoặc theo một thứ tự bất kỳ.

Ví dụ 2.27: Xét ví dụ 2.23 với ứng dụng cập nhật mã phòng của nhân viên có mã nhân viên mà mã nhân viên và mã phòng ban được nhập từ thiết bị đầu cuối.

Trong trường hợp này, ứng dụng sẽ phức tạp hơn, phải tìm mảnh nào có chứa bộ của nhân viên, đọc MAP cũ của nhân viên, xác định sự thay đổi của MAP để thay đổi mảnh mới chứa bộ này, và cuối cùng thực hiện các lệnh thêm vào và lệnh loại bỏ cần thiết. Các lệnh thêm vào và lệnh loại bỏ cần thiết là khác nhau đối với các mảnh đầu tiên và các mảnh cuối cùng chứa bộ này. Do đó, ứng dụng phải chứa mã lệnh để giải quyết tất cả các cách làm có thể có. Ví dụ này cho thấy tính trong suốt phân mảnh có ích lợi như thế nào đối với người lập trình ứng dụng trong trường hợp ứng dụng cập nhật, nhưng nó cũng ngầm định cho thấy sự phức tạp như thế nào đối với DDBMS để cung cấp đặc tính này.


Do đó, ứng dụng phải thực hiện các bước sau:

Bước 1: Mã nhân viên và mã phòng nhập từ thiết bị đầu cuối

Bước 2: Tìm mảnh chứa nhân viên có mã nhân viên là mã nhân viên được nhập Bước 3: Đọc mã phòng cũ của nhân viên, xác định sự thay đổi của mã phòng để

thay đổi mảnh mới chứa bộ này

Bước 4: Thực hiện các lệnh thêm vào và lệnh loại bỏ cần thiết

3) Trong suốt ánh xạ cục bộ

Ứng dụng giải quyết tường minh với vị trí của các mảnh và phải cập nhật cả các nhân bản.

Ví dụ 2.28: Xét quan hệ toàn cục NV trong ví dụ 2.23. Giả sử các mảnh của quan hệ được đặt theo cách sau:

NV1: nơi 1 và 2

NV2: nơi 3 và 4

NV3: nơi 5 và 6

NV4: nơi 7 và 8

Select MANV, HOTEN,LUONG,THUE

Into $MANV, $HOTEN, $LUONG, $THUE

From NV1 at site 1 Where MANV =‟NV5‟;

if #FOUND then begin

Select MAQL into $MAQL From NV2 at site 3

Where MANV =‟NV5‟;

Insert into NV3(MANV, HOTEN, MAP) at site 5 Values („NV5‟, $ HOTEN,12);

Insert into NV3(MANV, HOTEN, MAP) at site 6 Values („NV5‟, $ HOTEN,12);

Insert into NV4 (MANV, LUONG, THUE, MAQL) at site 7 Values („NV5‟, $SAL, $THUE, $MAQL);

Insert into NV4 (MANV, LUONG, THUE, MAQL) at site 8 Values („NV5‟, $SAL, $THUE, $MAQL);

Delete from NV1 at site 1 Where MANV =‟NV5‟;

Delete from NV1 at site 2 Where MANV =‟NV5‟;

Delete from NV2 at site 3


Where MANV =‟NV5‟;

Delete from NV2 at site 4 Where MANV =‟NV5‟;

End;

Ứng dụng được thực hiện như sau: Hai lệnh select đầu tiên có chứa mệnh đề at để chọn nơi truy xuất NV1 và NV2; hai lệnh insert và hai lệnh delete dùng để thêm các bộ mới vào tất cả các bản nhân của các mảnh chứa các bộ này và để loại bỏ các bộ cũ trong tất cả các bản nhân chứa các bộ này.

Lưu ý quan trọng là khi cập nhật dữ liệu, chúng ta phải bảo đảm dữ liệu mới phải thoả mãn tất cả các ràng buộc toàn vẹn có trong CSDL, kể cả CSDL tập trung và CSDL phân tán. Trong CSDL phân tán, việc cập nhật dữ liệu sẽ dẫn đến việc di chuyển dữ liệu từ các mảnh này qua các mảnh khác chỉ xảy ra khi các thuộc tính bị cập nhật có trong vị từ định tính của mảnh có dữ liệu được cập nhật và giá trị mới phải làm thay đổi giá trị của vị từ này đang là true bị trở thành false; các mảnh mới, chứa dữ liệu được di chuyển đến là các mảnh mà giá trị mới làm cho vị từ định tính của chúng có giá trị true.

Ngoài ra, trong ví dụ trên, nếu chúng ta có phụ thuộc hàm MAP MAQL, thì chương trình cập nhật ở trên chưa thay đổi giá trị MAQL của nhân viên có mã „NV5‟ thành giá trị mới.

2.4. Các thao tác cơ bản truy xuất CSDL phân tán

Trong các ví dụ của các phần trước, chúng ta luôn luôn giả sử mỗi thao tác cơ bản truy xuất CSDL (truy vấn) đều trả về kết quả là một giá trị đơn (single value) được gắn vào một biến đơn (single variable).

Tuy nhiên, chúng ta muốn sử dụng các thao tác cơ bản mạnh hơn mà chúng trả về kết quả là các quan hệ; trong trường hợp này chương trình thủ tục tựa – Pascal và các thao tác cơ bản SQL thay thế các tham số là các biến đơn thành các tập tin (các tập tin tham số – parameter file).

Để tránh vấn đề mô tả các kiểu, chúng ta sẽ sử dụng cách tiếp cận sau đây trong các ví dụ của chúng ta: các tham số có tên kết thúc bằng tiếp vị ngữ _REL được xem là thuộc kiểu tập tin trong chương trình tựa - Pascal và thuộc kiểu quan hệ trong các lệnh SQL, giả sử cấu trúc của chúng đã được khai báo.

Các 4 cách truy xuất cơ sở dữ diệu với tính trong suốt phân mảnh:

- Truy xuất CSDL với mỗi giá trị

- Truy xuất CSDL sau khi nhập vào tất cả các giá trị

- Truy xuất CSDL trước khi nhập vào các giá trị

- Truy xuất CSDL sử dụng biểu thức con chung

Chương trình ứng dụng


Viết theo ngôn ngữ tựa PASCAL (PASCAL-like language) có nhúng các lệnh SQL.

- Các thủ tục chuẩn:

Read(terminal, ,…,): thủ tục nhập Write(terminal, ,…,): thủ tục xuất Trong đó:

+ terminal: là tên tập tin (việc nhập xuất được thực hiện tại thiết bị đầu cuối thì tên tập tin terminal sẽ được sử dụng)

+ iv1,…,ivn: là danh sách các tham số nhập

+ ov1,…,ovn: là danh sách các tham số xuất

- Lệnh SQL: định nghĩa một thao tác cơ bản truy xuất CSDL

+ Bước 1: Nhận một tham số từ chương trình tựa- Pascal

+ Bước 2: Truy xuất CSDL

+ Bước 3: Trả về kết quả như là một tập tin

- Cách khai báo các tham số nhập: $tên_biến

- Cách khai báo tham số xuất: $tên_tập_tin_REL(Danh sách các mẩu tin)

Ví dụ 2.29: Xét hệ thống quản lý dự án của một công ty phát triển phần mềm trong ví dụ 1.5. Giả sử có ứng dụng cho biết mã dự án được triển khai bởi nhân viên có mã nhân viên được nhập từ thiết bị đầu cuối.

Ví dụ 2.30: Xét hệ thống quản lý kinh doanh của một công ty trong ví dụ 2.13. Giả sử có các ứng dụng cho biết tên nhà cung cấp, địa chỉ mà họ cung cấp một mặt hàng có mã mặt hàng được nhập từ thiết bị đầu cuối.

2.4.1. Truy xuất CSDL với mỗi giá trị

Ưu điểm của chương trình là cho kết quả đáp ứng nhanh sau mỗi lần nhập dữ liệu cần tìm kiếm.

Các bước thực hiện truy xuất: Repeat

Bước 1: Nhận tham số từ chương trình tựa- Pascal

Read (terminal, $iv1,…,$ivn);

Bước 2: Xóa toàn bộ các bộ từ tệp $tên_tập_tin_REL Delete From $tên_tập_tin_REL;

Bước 3: Đưa kết quả được tìm thấy vào tệp $tên_tập_tin_REL Insert into $tên_tập_tin_REL($ov1,…,$ovn) Values(Select fn1, …, fnn

From R1, R2,…,Rn

Where ); Trong đó:


+ fn1,…., fnn là tên các trường

+ R1, R2,…, Rn là các quan hệ toàn cục

Bước 4: Với mỗi giá trị được nhập, chương trình quét tệp tin tham số

$tên_tập_tin_REL và đưa kết quả về thiết bị đầu cuối

Repeat

Read ($tên_tập_tin_REL, $ov1,…,$ovn) Write(terminal, ($ov1,…,$ovn)

Until END – OF- $tên_tập_tin_REL Until END –OF –terminal – input;

1) Với ví dụ 2.29, chương trình được viết như sau:

Repeat

Read (terminal, $MANV); Delete from $DA_REL;

Insert into $DA_REL ($MADA) Values(Select MADA

From HS

Where MANV=$MANV);

Repeat

Read ($DA_REL, $MADA) write(terminal, $MADA)

until END – OF- $DA_REL until END –OF –terminal – input;

Đối với mỗi nhân viên có mã $MANV được người sử dụng nhập vào, các dự án mà nhân viên này tham gia sẽ được lấy ra và đưa vào tập tin tham số $DA_REL. Vòng lặp bên trong quét tập tin tham số này và trình bày các dự án mà nhân viên này tham gia.

2) Với ví dụ 2.30, chương trình được viết như sau:

Repeat

Read (terminal, $MAMH); Delete from $NCC_REL;

Insert into $NCC_REL ($TENNCC, $DC) Values(Select TENNCC, DC

From MH, KD

Where MH.MANCC= KD.MANCC and MAMH = $MAMH);

Repeat

Read ($NCC_REL, $TENNCC, $DC)

write(terminal, $TENNCC, $DC) until END – OF- $NCC_REL


until END –OF –terminal – input;

Đối với mỗi nhà cung cấp có mã $MAMH được người sử dụng nhập vào, các nhà cung cấp cung cấp mặt hàng bao gồm các thông tin tên nhà cung cấp, địa chỉ sẽ được lấy ra và đưa vào tập tin tham số $NCC_REL. Vòng lặp bên trong quét tập tin tham số này và trình bày các nhà cung cấp đã cung cấp mặt hàng được chọn.

2.4.2. Truy xuất CSDL sau khi nhập vào tất cả các giá trị

Trước tiên ứng dụng này thu thập tất cả các thông tin được nhập và sau đó truy xuất CSDL. Do đó việc lấy dữ liệu chỉ một lần với tập tin tham số lớn hơn so với cách truy xuất CSDL với mỗi giá trị. Bằng cách này, số thao tác truy xuất trong CSDL phân tán giảm, cùng một lượng kết quả dữ liệu được truyền về, nhưng ít thông điệp điều khiển được sử dụng.

Người lập trình có thể điều khiển việc truy xuất CSDL ngay cả khi họ làm việc ở mức toàn cục.

Sự chọn lựa giữa hai giải pháp ở trên phụ thuộc vào kết quả bộ trả về khi kết nối giữa hai quan hệ và vào số lượng các bộ mà ứng dụng dùng đến. Rò ràng, một sự thoả thuận (trade – off) giữa thời gian đáp ứng (response time) và toàn bộ thời gian tiêu tốn của hệ thống (system overhead) phải được xem xét: nếu muốn tối thiểu hoá (minimization) số lượng các công việc thì giải pháp thứ hai là tốt hơn; nếu muốn đáp ứng nhanh sau mỗi lần nhập mã nhà cung cấp thì giải pháp đầu tiên là tốt hơn.

Một ứng dụng có thể truy xuất các tập hợp lớn nếu nó được kết bó (batched) và ít tương tác; sự thoả thuận này giữa các giải pháp kết bó hơn và trực tuyến hơn cũng đã được biết nhiều trong các CSDL truyền thống.

Các bước thực hiện truy xuất:

Bước 1: Đưa tất cả các thông tin được nhập từ thiết bị đầu cuối vào tệp

$tên_tập_tin_REL

Repeat

Read (terminal, $iv1,…,$ivn);

Insert into $tên_tập_tin1_REL($iv1,…,$ivn)

Values($iv1,…,$ivn)

until END –OF –terminal – input;

Bước 2: Tìm các thông tin thỏa mãn điều kiện trong tệp $tên_tập_tin1_REL và đưa vào trong tệp $tên_tập_tin2_REL

Insert into $tên_tập_tin2_REL($ov1,…,$ovn)

Values(

Select $iv1,…,$ivn, fn1,…,fn2

From R, $tên_tập_tin1_REL

Where R.fni= $tên_tập_tin1_REL.$ivni);


Trong đó tệp $tên_tập_tin1_REL được sử dụng như là một quan hệ

Bước 3: Với mỗi giá trị được nhập, chương trình quét tệp tin tham số

$tên_tập_tin2_REL và đưa kết quả về thiết bị đầu cuối

Repeat

Read ($tên_tập_tin2_REL, $ov1,…,$ovn);

Write(terminal, ($ov1,…,$ovn)

Until END – OF- $PNUM_REL;

1) Với ví dụ 2.29, chương trình được viết như sau:

Repeat

Read (terminal, $MANV); Insert into $NV_REL($MANV) Values($MANV)

Until END –OF –terminal – input; Insert into $DA_REL($MADA, $MANV) Values(

Select MADA, $MANV From HS, $NV_REL

Where HS.MANV= $NV_REL.$MANV);

Repeat

Read ($DA_REL ($MADA, $MANV);

Write(terminal, ($MADA, $MANV) Until END – OF- $DA_REL;

Trước tiên ứng dụng này thu thập tất cả các mã nhân viên được nhập và đưa và tệp

$NV_REL và sau đó truy xuất CSDL đưa vào tập tin tham số $DA_REL. Tiếp theo, chương trình quét tập tin $DA_REL và trình bày các dự án mà nhân viên này tham gia.

2) Với ví dụ 2.30, chương trình được viết như sau:

Repeat

Read (terminal, $MAMH); Insert into $MH_REL($MAMH) Values($MAMH)

Until END –OF –terminal – input;

Insert into $NCC_REL ($TENNCC, $DC) Values(Select TENNCC, DC

From MH, KD, $MH_REL

Where MH.MANCC= KD.MANCC and KD.MAMH =$MH_REL. $MAMH);

Repeat

Read ($NCC_REL, $TENNCC, $DC)

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 28/06/2022