Mô hình ghép đôi không xứng:

Một phần của tài liệu Cổng báo cáo tổng hợp trực tuyến phục vụ HTTT chỉ đạo ngành y tế cộng đồng (Trang 94 - 100)

L ỜI MỞ ĐẦU

2.2.2.Mô hình ghép đôi không xứng:

2. Hibernate

2.2.2.Mô hình ghép đôi không xứng:

Xét ví dụ: Chúng ta cần 1 lớp để mô tả thông tin cho một đối tượng “User” và một lớp khác để mô tả cho đối tượng khác “BillingDetails”. Ta phải xác định mối quan hệ giữa các lớp trong cả 2 phía:

public class User {

private String userName; private String name; private String address; private Set billingDetails; ….

}

public class BillingDetails {

private String accountNumber; private String accountName; private String accountType; private User user;

…. }

Dùng các câu lệnh SQL để định nghĩa cơ sở dữ liệu: Create table USER

(

USERNAME VARCHAR(10) NOT NULL PRIMARY KEY,

Luận văn tốt nghiệp 0112049 - 0112322

NAME VARCHARR(50) NOT NULL,

ADDRESS VARCHAR(100)

)

create table BILLINGDETAILS (

ACCOUNT_NUMBER VARCHAR(10) NOT NULL PRIMARY KEY, ACCOUNT_NAME VARCHAR(50) NOT NULL,

ACCOUNT_TYPE VARCHAR(15) NOT NULL,

USERNAME VARCHAR(10) FOREIGN KEY REFERENCES USER )

Mối quan hệ giữa 2 thực thể này được mô tả là khoá ngoại USERNAME

trong bảng BILLINGDETAILS. Việc mô tả như thế không khó khăn cho việc viết các câu lệnh để insert, update, delete thông tin của User và BillingDetails.

Sự không tương thích sẽ xuất hiện khi thêm nhiều thực thể và thêm các mối quan hệ giữa các thực thể này vào ứng dụng.

Nếu như bên cạnh lưu trữ thông tin của User, chúng ta cần lưu trữ thêm thông tin địa chỉ một cách riêng biệt (street, city, state, country, ZIP code). Thực thể Address được thêm vào như hình vẽ:

Thực tế, chúng ta không cần thêm một bảng Address vì với một câu truy vấn từ bảng User ta cũng có thể lấy được thông tin về Address của User đó. Chúng ta có thể chọn phương án định nghĩa một cột hoặc nhiều cột để lưu trữ thông tin về địa chỉ của User.

™ Vấn đề về “Tính chia nhỏ”:

Nói đến “tính chia nhỏ” tức là đề cập đến kích thước của các đối tượng trong ứng dụng. Các đối tượng trong java và các dữ liệu bảng có thể có nhiều cách chia nhỏ khác nhau. Xét đến ví dụ đã nêu trên, việc thêm một loại dữ liệu để lưu trữ đối tượng Address trên một cột duy nhất có thể được xem là cách tốt nhất. Tuy nhiên, sẽ có một vài vấn đề khi chúng ta cần lấy thông tin riêng lẻ của đối tượng Address.

User Billing Details

Luận văn tốt nghiệp 0112049 - 0112322

Để giải quyết yêu cầu này, chúng ta sẽ chia nhỏ việc lưu trữ thông tin Address của user trên nhiều cột. Bảng User được xây dựng lại như sau:

Create table USER(

USERNAME VARCHAR(10) NOT NULL PRIMARY KEY, NAME VARCHARR(50) NOT NULL,

ADDRESS_STREET VARCHAR(50), ADDRESS_CITY VARCHAR(15), ADDRESS_STATE VARCHAR(15), ADDRESS_ZIPCODE VARCHAR(5), ADDRESS_COUNTRY VARCHAR(15) ) (adsbygoogle = window.adsbygoogle || []).push({});

Ở đây, các lớp đối tượng có thể được xây dựng và sắp xếp ở các mức khác nhau của sự chia nhỏ. Thực thể User được chia nhỏ gồm các thuộc tính (username, name, address). Sau đó Address lại được chia nhỏ để lưu trữ các thông tin riêng lẻ (Address_street, Address_city, Address_state, Address_zipcode, Address_country).

™ Vấn đề về “Lớp kế thừa”:

Trong java, chúng ta thường sử dụng tính kế thừa bằng cách xây dựng các lớp chính và lớp phụ (lớp kế thừa). Trở lại ví dụ trên, bây giờ lưu trữ thêm thông tin liên quan đến User là CreditCard và BankAccount. Có nhiều cách để xây dựng đối tượng User nhưng thông thường chúng ta xây dựng các đối tượng kế thừa. Ở đây, ta xây dựng thêm 2 lớp CreditCard và BankAccount là 2 lớp kế thừa của BillingDetails. Khi xây dựng cơ sở dữ liệu, chúng ta định nghĩa bảng CREDIT_CARD_DETAILS là một bảng phụ nhưng không thể khai báo tính kế thừa của CreditCard bằng các câu lệnh SQL như CREATE TABLE CREDIT_CARD_DEATAILS EXTENDS BILLINGDETAILS (…). Trong cơ sở

dữ liệu SQL, các mối quan hệ này được định nghĩa dựa trên các khoá chính, khoá

ngoại đến bảng khác.Vấn đề là chúng ta sẽ dùng cách nào để khai báo các lớp phụ là kế thừa của các lớp chính khi xây dựng các lớp đối tượng trong java.

™ Vấn đề về “định danh”:

Thông thường, vấn đề về định danh các đối tượng ít được quan tâm nhưng

trong một vài trường hợp chúng ta phải chú ý đến vấn đề này. Chẳng hạn, khi ta quan tâm đến 2 đối tượng là Users và chúng ta phải giải quyết vấn đề về nhận dạng

Luận văn tốt nghiệp 0112049 - 0112322

khi chúng hoàn toàn giống nhau. Có nhiều cách để giải quyết, có thể xác định 2 đối tượng trong java, nhưng chung 1 cơ sở dữ liệu.

Các đối tượng java định nghĩa 2 khái niệm về sự giống nhau:

• Định danh đối tượng (tương đương về vị trí lưu trữ, xác định bởi biểu thức a = = b)

• Đẳng thức được xác định bởi phương thức equals().

Định danh trong bảng dữ liệu được thể hiện như là giá trị khoá chính. Vấn đề là chúng ta sẽ xác định cột nào được xem là khoá chính, để có thể khắc phục được sự tồn tại các dòng dữ liệu giống nhau.

Trong ví dụ trên, chúng ta xác định USERNAME là khoá chính của bảng USER. Như vậy, chúng ta sẽ không thể cập nhật lại giá trị của USERNAME trong bảng USER cũng như giá trị của nó trong khoá ngoại ở bảng BILLINGDETAILS. Chúng ta sẽ sử dụng khoá thay thế để giải quyết các vấn đề trên và người dùng không cần quan tâm nhiều đến các khoá thay thế này. Chúng ta có thể xây dựng lại cấu trúc của bảng USER như sau:

Create table USER (

USER_ID BIGINT NOT NULL PRIMARY KEY, USERNAME VARCHAR(10) NOT NULL UNIQUE, NAME VARCHARR(50) NOT NULL,

…. )

create table BILLINGDETAILS (

BILLING_DETAILS_ID BIGINT NOT NULL PRIMARY KEY, ACCOUNT_NUMBER VARCHAR(10) NOT NULL UNIQUE, ACCOUNT_NAME VARCHAR(50) NOT NULL,

ACCOUNT_TYPE VARCHAR(15) NOT NULL,

USER_ID BIGINT FOREIGN KEY REFERENCES USER )

Luận văn tốt nghiệp 0112049 - 0112322

Các cột USER_ID và BILLING_DETAILS_ID là các giá trị tự động phát

sinh trong hệ thống. Khi xây dựng như trên, không xảy ra hiện tượng trùng lặp dữ liệu. Username trong hệ thống là duy nhất và chúng ta có thể cập nhật khi cần thiết.

™ Vấn đề về “ Sự kết hợp”

Sự kết hợp được thể hiện bởi các mối quan hệ giữa các thực thể. Các lớp

User, Address, BillingDetails đều có mối kết hợp với nhau. Tuy nhiên, lớp BillingDetails có thể đứng 1 mình, được lưu trữ bởi bảng riêng lẻ các thông tin của chúng, không bị ảnh hưởng bởi sự tồn tại của các bảng khác. Để xác định các mối kết hợp, chúng ta có thể sử dụng đối tượng quan hệ và định nghĩa các cột là khoá ngoại liên quan giữa các bảng.

Ví dụ, mối kết hợp có thể được xác định trực tiếp từ đối tượng này đến đối tượng khác. Trong mỗi lớp đối tượng đều thể hiện được mối kết hợp này.

Public class User { (adsbygoogle = window.adsbygoogle || []).push({});

private Set billingDetails; }

public class BillingDetails {

private User user; }

Trong trường hợp khác, khoá ngoại cũng không được thể hiện một cách trực tiếp mà chúng ta sẽ tạo ra các mối kết hợp với việc kết bảng và tính chất chiếu.

Ví dụ về xây dựng mối kết hợp nhiều - nhiều (many-to-many): public class User

{

private Set billingDetails; }

public class BillingDetials {

private Set User users; }

Luận văn tốt nghiệp 0112049 - 0112322

Khi ta xác định mối quan hệ nhiều-nhiều cho 2 đối tượng User và BillingDetails, chúng ta cần xác định sự liên kết bảng trong cơ sở dữ liệu như sau:

Create table USER_BILLING_DETAILS (

USER_ID BIGINT FOREGIN KEY REFERENCES USER,

BILLING_DETAILS_ID FOREGIN KEY REFERENCES BILLING_DETAILS, PRIMARY KEY (USER_ID, BILLING_DETAILS_ID)

)

™ Vấn đề về “Định hướng đồ thị đối tượng”:

Có nhiều cách khác nhau để truy xuất đến các đối tượng trong java và trong cơ sở dữ liệu quan hệ. Ví dụ, trong java, chúng ta có thể truy xuất đến thông tin billing của user bằng cách gọi aUser.getBillingDetails().getAccountNumber(). Đây là cách thức thông dụng nhất để truy xuất các thông tin đối tượng, từ đối tượng này đến đối tượng khác.

Tuy nhiên, đó không phải là cách hiệu quả để lấy dữ liệu từ cơ sở dữ liệu. Trong cơ sở dữ liệu, cách thức để lấy dữ liệu hiệu quả là sử dụng các phép kết các bảng lại với nhau.

Khi cần lấy thông tin User:

Select * from USER u where u.USER_ID = 123

Hoặc khi cần lấy các thông tin BillingDetails của 1 User:

Select *

From USER u

Left outer join BILLING_DETAILS bd on bd.USER_ID = u.USER_ID Where u.USER_ID = 123

Như vậy, trong ngữ cảnh cơ sở dữ liệu quan hệ, việc truy xuất đến dữ liệu đòi hỏi phải xác định đồ thị đối tượng cho đối tượng trước khi định hướng cho đồ thị đối tượng đó.

Sự không tương xứng ở đây chính là vấn đề về cách thức truy xuất đến dữ

liệu trong java và trong cơ sở dữ liệu quan hệ.

Luận văn tốt nghiệp 0112049 - 0112322

Khi xây dựng và phát triển các ứng dụng java, việc xây dựng các đối tượng trong java và việc lưu trữ trên cơ sở dữ liệu quan hệ thường xảy ra hiện tượng “không tương xứng”. Sự “không tương xứng” này xuất phát từ nhiều nguyên nhân, có thể do cách định nghĩa các đối tượng, hoặc do việc xác định các mối quan hệ giữa các đối tượng mà gây ảnh hưởng đến việc lưu trữ, truy xuất thông tin đối tượng trên java và trên cơ sở dữ liệu không tương thích với nhau. Các vấn đề này phải được giải quyết để hạn chế tối đa về chi phí khắc phục khi gặp sự cố.

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Cổng báo cáo tổng hợp trực tuyến phục vụ HTTT chỉ đạo ngành y tế cộng đồng (Trang 94 - 100)