II. Mô hình phân tán dữ liệu tại WSC
4. Các chú ý khi tạo các bảng tại các chi nhánh trong cấu hình CSDL
phân tán.
- Đảm bảo các ràng buộc: Các ràng buộc của các bảng tại các chi nhánh (tức là tại một CSDL) đơng nhiên phải đợc đảm bảo. Ngoài ra các ràng buộc này phải đợc đảm bảo trên toàn bộ hệ thống dữ liệu (bao gồm nhiều CSDL). Oracle Server tại một CSDL không thể đảm bảo đợc điều này, do đó ta phải thiết kế một cách hợp lý để đảm bảo đợc điều này.
- Phải xác định đợc nơi phát sinh dữ liệu cho một bảng nhất định (tại các chi nhánh, tại trung tâm hoặc cả hai).
- Tên của các bảng: Các module tại các chi nhánh khi thực hiện thao tác lên CSDL có một yêu cầu là tên các đối tợng đợc sử dụng phải ổn định mặc dù đối tợng đó có thể có kiểu khác nhau (table, view, synonym, snapshot...). Trong khi đó các bảng đợc tạo ra cha chắc đã là các đối tợng truy nhập trực tiếp của các module, mà nó phải kết hợp với các đối tợng mới, do đó các bảng có thể phải đổi tên để cho các đối tợng có thể sử dụng tên đó. Nh vậy các module mới có thể truy nhập trực tiếp các đối tợng.
Để đảm bảo cho mô hình dữ liệu phân tán đáp ứng đợc các chú ý trên ta phải thực hiện việc phân tích từng bảng trong hệ thống để có đợc những thông tin cần thiết trong bảng sau:
Chú thích:
- Table name: Là tên bảng theo thiết kế hiện tại.
- Owner: Xác định xem quyền làm chủ bảng sẽ là trung tâm hay chi nhánh. Giá trị cho cột này có thể là một trong hai giá trị 'Trung tâm' hoặc 'Chi nhánh'. Quyền làm chủ ở đây có nghĩa là các thao tác Update lên bảng sẽ do phía nào thực hiện. Nếu một bảng nào đó có thể Update đợc từ cả trung tâm và chi nhánh thì mô hình dữ liệu phân tán ở trên sẽ không áp dụng đợc.
- Constrains: Liệt kê tất cả các ràng buộc trên bảng theo thứ tự và khuôn dạng sau:
Primary key: PK_NAME(column1,column2,...) Unique key: UK_NAME(column1,column2,...)
Foreign key: FK_NAME(col1,col2,...) => REF_TABLE(ref_col1,ref_col2,...)
- Sequences: Liệt kê tất cả các sequence mà bảng có sử dụng đến theo khuôn dạng sau: SEQ_NAME(column_use_this_sequence)
Ví dụ 1:
ABC: Assign billing cycle to customers. Owner: Branch.
Constraints:
+ ASS_BCY_PK(CUST_ID, STT)
+ ASS_BCY_BLL_CYS_FK (BRANCH_ID,BC_CODE)=> BILLING_CYC (BARANCH_ID, CODE)
+ ASS_BCY_CUST_FK (CUST_ID) => CUSTOMERS(ID) Sequences:
Notes:
Names:
+ Branch: Table ABC
+ Center: Snapsshot ABC$TD, ABC$SG ...; View ABC Ví dụ 2: ACTIVITIES_CUST_PARAMETERS
Constraints:
+ ACTIVITY_C_PK(ID,CPRS_ID)
+ ACTIVITY_C_ ACTIVITY_FK(ID) => ACTIVITY(ID) + ACTIVITY_C_CPRS_FK (CPRS_ID)
=> CUST_ PARAMETERS(CPRS_ID) Sequences:
Notes: Định nghĩa tại trung tâm và đợc sử dụng tại các chi nhánh trong các giao dịch với khách hàng.
a. Cách đặt tên:
- Nếu một bảng có nguồn gốc từ chi nhánh thì cách đặt tên nó nh sau: Tại các chi nhánh có các bảng cùng tên.
Tại trung tâm: Các Snapshot có tên tạo bởi tên bảng ghép với dấu $ và mã chi nhánh, một View có cùng tên với bảng tổng hợp dữ liệu từ các Snapshot.
Ví dụ :
Bảng ABC có nguồn gốc từ các chi nhánh do đó nó có cách tổ chức nh sau:
Tại các chi nhánh Sài Gòn, Chợ Lớn, Thủ Đức, Gia Định có các bảng tên là ABC. Tại trung tâm có 4 snapshot là ABC$SG, ABC$CL, ABC$TD, ABC$GD lấy dữ liệu từ các bảng ở các chi nhánh theo câu lệnh sau:
CREATE SNAPSHOT ABC$SG AS SELECT * FROM ABC@saigon;
và một View tổng hợp dữ liệu từ 4 chi nhánh: CREATE VIEW ABC AS SELECT * FROM ABC$SG UNION
SELECT * FROM ABC$CL UNION
SELECT * FROM ABC$TD UNION
- Nếu một bảng có nguồn gốc từ trung tâm và dữ liệu của nó không phụ thuộc vào từng chi nhánh thì nó có cách đặt tên nh sau:
Tại trung tâm có một bảng nh tên đã định.
Tại mỗi chi nhánh có một Snapshot có cùng tên.
Ví dụ: Bảng EXCHANGES có nguồn gốc từ trung tâm. Tại trung tâm có một bảng có tên là EXCHANGES.
Tại mỗi chi nhánh có một Snapshot có tên EXCHANGES và đợc tạo ra
nh sau:
CREATE SNAPSHOT EXCHANGES
AS SELECT * FROM EXCHANGES@wsc ;
- Nếu bảng có nguồn gốc trung tâm nhng bản thân dữ liệu lại phụ thuộc từng chi nhánh thì nó cùng có cách đặt tên nh trên nhng khác ở câu lệnh tạo Snapshot.
Ví dụ: Tạo Snapshot BILLS tại chi nhánh Chợ Lớn CREATE SNAPSHOT BILLS AS
SELECT * FROM BILLS@wsc WHERE BRANCH_CODE = 'CL' ;
b. Cách tạo các FK:
Tại các chi nhánh: FK có liên quan đến các Snapshot (đến hoặc đi từ) vẫn
đợc giữ nguyên, chỉ có tên bảng chứa Snapshot đợc sử dụng thay vì tên Snapshot.
Tại trung tâm: FK có dính dáng đến các Snapshot đợc tách thành 4 FK. c. Tiến hành:
Sử dụng Designer/2000 để thực hiện việc tạo các DDL scripts.
- Tạo hai Application đại diện cho trung tâm và chi nhánh (CENTER và BRANCH), và tạo một Application tên là ALL_OBJECTS phục vụ cho mục đích tạo ra các FK của tất cả các bảng trong hệ thống một cách tổng thể.
- Vào các ứng dụng WBL, WCA, WMA và WMI để share tất cả các bảng cho hai ứng dụng này một cách tơng ứng (bảng nào có nguồn gốc trung tâm
thì đa vào ứng dụng CENTER và ngợc lại bảng nào có nguồn gốc chi nhánh thì đa vào ứng dụng BRANCH.
Share tất cả các bảng và sequence của 4 ứng dụng WBL, WCA, WMA, WMI cho ứng dụng ALL_OBJECTS.
- Tại CENTER tạo tất cả các snapshot cần thiết tham chiếu đến các bảng của các chi nhánh theo cách đặt tên ở trên, sau đó tạo các Views tơng ứng tổng hợp thông tin từ các Snapshot.
- Tại BRANCH tạo tất cả các Snapshot tham chiếu đến các bảng của CENTER, cần để ý đến điều kiện chọn lọc trong một số bảng có liên quan đến chi nhánh.
Để tạo điều kiện chọn lọc khả thi, có một số cách nh sau:
Bảng BRANCH tại chi nhánh chỉ chứa thông tin của riêng chi nhánh đó. Tuy nhiên một số module (mặc dù hoạt dộng tại chi nhánh) cần biết đến tất cả các chi nhánh khác.
Bảng BRANCH chứa thông tin về tất cả các chi nhánh và có một bảngriêngcùngcấu trúc với BRANCH chứa thông tin về chi nhánh hiện tại.
Bảng BRANCH chứa thông tin về tất cả các chi nhánh và trong bảng WSC_PARAMETERS có chứa một bản ghi chỉ ra mã của chi nhánh hiện thời.
Ta sẽ chọn cách thứ 3 để thực hiện.
Ví dụ với chi nhánh Chợ Lớn, ta thực hiện lệnh sau:
INSERT INTO WSC_PARAMETERS (NAME, VALUE, DESCRIPTION) VALUES('BRANCH_CODE', 'CL', 'M của chi nhánh hiện tại') ;ã
Khi đó điều kiện để lấy bảng BNR nh sau: CREATE SNAPSHOT BNR
AS SELECT * FROM BNR@wsc
WHERE BRANCH_ID IN SELECT BRANCH.ID FROM BRANCH, WSC_PARAMETERS
WHERE BRANCH.BRANCH_CODE = WSC_PARAMETERS.VALUE AND WSC_PARAMETERS.NAME = 'BRANCH_CODE' ;
Lần lợt vào 3 ứng dụng CENTER, BRANCH, và ALL_OBJECTS để thực hiện việc tạo ra các DDL script.