Professional Documents
Culture Documents
GIÁO TRÌNH
Trịnh
nh Hoàng Nam (Ch
(Chủ biên)
Nguyễn
Nguy Thị Trà Linh
Thuật ngữ Cơ sở dữ liệu giờ đây được áp dụng rộng rãi trong nhiều lĩnh vực ngoài Công
nghệ thông tin, như là Tài chính – Ngân hàng, Kế toán – Kiểm toán, Thẩm định dự án, …
Bản thân môn học Cơ sở dữ liệu cũng xuất hiện ở các chương trình đào tạo khác nhau với
nhiều trình độ khác nhau từ trung cấp, cao đẳng, đến đại học, và cả sau đại học.
Trên thị trường hiện nay có khá nhiều tài liệu tham khảo về Cơ sở dữ liệu, nhưng hầu hết
đều nhắm đến đối tượng người đọc là những sinh viên khối ngành Công nghệ thông tin
hoặc có những kiến thức nhất định về công nghệ thông tin. Xuất phát từ thực tế đó, chúng
tôi bắt tay biên soạn giáo trình Cơ sở dữ liệu với cách tiếp cận đơn giản dễ hiểu, phù hợp
với mọi đối tượng người đọc, kể cả những người chưa từng tham gia bất kỳ lớp học nào
về công nghệ thông tin.
1
Giáo trình tập trung trình bày những kiến thức cần thiết về cơ sở dữ liệu, từ những khái
niệm cơ bản khi mới bắt đầu làm quen, cho đến những vấn đề quan trọng, có tính quyết
định tới sự thành bại khi xây dựng một cơ sở dữ liệu thực tế. Với các kiến thức lý thuyết
được trình bày một cách cô đọng, ngắn gọn và dễ hiểu; các ví dụ minh họa đa dạng,
phong phú, chúng tôi hy vọng giáo trình này đáp ứng được nhu cầu nghiên cứu và học
tập của nhiều đối tượng người học khác nhau.
Mặc dù có rất nhiều cố gắng trong công tác biên soạn, nhưng giáo trình chắc chắn sẽ có ít
nhiều khiếm khuyết. Chúng tôi rất mong nhận được các ý kiến đóng góp để có thể hoàn
thiện giáo trình trong lần tái bản tiếp theo.
2
C
CHHƯ
ƯƠƠN
NGG
1
TỔNG QUAN VỀ
HỆ THỐNG CƠ SỞ DỮ LIỆU
Mục tiêu
Chương này cung cấp cho người đọc các khái niệm cơ bản về cơ sở dữ liệu
giúp có cái nhìn ban đầu về cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu và mối
tương quan giữa chúng với nhau.
Nội dung
Hệ thống hướng tệp tin
Hệ thống hướng cơ sở dữ liệu
Hệ quản trị cơ sở dữ liệu
Người dùng cơ sở dữ liệu
Ngôn ngữ và giao diện ngôn ngữ dữ liệu
Email: namth@buh.edu.vn 3
Giới thiệu
Khái niệm cơ sở dữ liệu ra đời từ rất sớm, và kể từ đó, cơ sở dữ liệu trở thành một
bộ phận không thể tách rời đối với các hệ thống thông tin trên máy tính. Cơ sở dữ
liệu ra đời trong bối cảnh hàng loạt vấn đề phát sinh trong các hệ thống sử dụng
tệp tin làm phương tiện để lưu trữ dữ liệu.
Chúng ta bắt đầu tìm hiểu cơ sở dữ liệu bằng việc giới thiệu một loại công cụ hỗ
trợ giao tiếp với cơ sở dữ liệu, đó là hệ quản trị cơ sở dữ liệu. Tiếp theo chúng ta
phân loại các đối tượng người dùng cơ sở dữ liệu dựa trên quyền hạn và trách
nhiệm của họ đối với cơ sở dữ liệu. Cuối cùng, chúng ta làm quen với ba nhóm
ngôn ngữ mà qua đó chúng ta tương tác với hệ quản trị cơ sở dữ liệu: ngôn ngữ
định nghĩa dữ liệu, ngôn ngữ thao tác dữ liệu, và ngôn ngữ điều khiển dữ liệu.
Email: namth@buh.edu.vn 4
1.1 HỆ THỐNG HƯỚNG TỆP TIN
Một tệp tin có thể xem là một cặp hồ sơ lưu trữ các thông tin liên quan đến từng
công việc riêng biệt. Việc xử lý để lấy ra thông tin theo yêu cầu được thực hiện
một cách thủ công. Tuy nhiên, theo thời gian, khối lượng thông tin ngày càng lớn,
việc xử lý để lấy các thông tin theo yêu cầu ngày càng trở nên phức tạp. Do đó,
máy tính được đưa vào sử dụng. Các cặp hồ sơ được chuyển thành tệp trên máy
tính và việc xử lý thông tin được thể hiện bằng cách lập trình.
Việc áp dụng hệ thống hướng tệp tin có một số ưu điểm như sau:
Việc xây dựng các ứng dụng cũng như các tệp tin dữ liệu đáp ứng cho từng
công việc riêng biệt cho nên về cơ bản ít tốn thời gian, không đòi hỏi đầu tư
nhiều về thời gian, vật chất, đồng thời lại có thể nhanh chóng đưa vào sử
dụng.
Thông tin được khai thác chỉ phục vụ cho một số ít người sử dụng với một
số mục đích cụ thể, cho nên tính an toàn cao, khả năng đáp ứng nhanh
chóng, kịp thời.
Tuy nhiên, các hệ thống kiểu này cũng có nhiều nhược điểm, cụ thể như sau:
Dư thừa thông tin, cùng một thông tin được lưu trữ nhiều điểm khác nhau.
Điều này gây ra việc lãng phí bộ nhớ, dễ dàng gây sai sót trong khi cập nhật
Email: namth@buh.edu.vn 5
dữ liệu, dữ liệu trở nên thiếu đồng bộ, không nhất quán, thậm chí còn xung
đột lẫn nhau.
Sự phụ thuộc chặt chẽ giữa chương trình ứng dụng. Mỗi khi có sự thay đổi
về cấu trúc tệp và các dữ liệu trong tệp, chương trình ứng dụng khai thác
thông tin trên tệp đó cũng phải thay đổi theo. Điều này gây ra khó khăn lớn
cho việc bảo trì hệ thống.
Để khắc phục những nhược điểm nói trên, hệ thống hướng cơ sở dữ liệu ra đời và
không ngừng phát triển cho đến ngày nay.
Cơ sở dữ liệu là hệ thống các dữ liệu có cấu trúc được lưu trữ trên các thiết bị lưu
trữ thứ cấp để thỏa mãn nhu cầu khai thác thông tin của nhiều người sử dụng hoặc
nhiều chương trình ứng dụng với nhiều mục đích khác nhau. Trong khái niệm này,
chúng ta cần nhấn mạnh cơ sở dữ liệu phải là một tập hợp các dữ liệu có liên quan
về mặt luận lý, chứ không phải là những dữ liệu rời rạc, không có mối quan hệ với
nhau. Các dữ liệu này phải có cấu trúc, và chúng phải có khả năng đáp ứng các
nhu cầu khai thác thông tin của nhiều người sử dụng.
Sự ra đời của các hệ thống hướng cơ sở dữ liệu đã giải quyết triệt để những vấn đề
mà hệ thống hướng tệp tin gặp phải trước đó, cụ thể như sau:
Giảm sự trùng lặp dữ liệu xuống mức thấp nhất, và do đó đảm bảo được
tính nhất quán và toàn vẹn dữ liệu.
Đảm bảo dữ liệu có thể được truy xuất theo nhiều cách khác nhau.
Khả năng chia sẻ thông tin cho nhiều người sử dụng và nhiều ứng dụng
khác nhau dùng dữ liệu đó.
Email: namth@buh.edu.vn 6
1.3 MỤC TIÊU CỦA HỆ THỐNG HƯỚNG CƠ SỞ
DỮ LIỆU
Hệ thống hướng cơ sở dữ liệu với những ưu điểm tuyệt đối của nó so với hệ thống
hướng tệp tin ra đời trước đó đã nhanh chóng được giới chuyên môn chấp nhận và
đưa vào triển khai. Khi xây dựng một hệ thống hướng cơ sở dữ liệu thương mại
hay phi thương mại, chúng ta đều hướng tới thực hiện các mục tiêu chính yếu sau
đây:
a) Đảm bảo ý nghĩa của dữ liệu. Dữ liệu có tính chia sẻ, nhiều người có
quyền sử dụng, thậm chí là thay đổi giá trị của dữ liệu, từ đó làm thay đổi ý
nghĩa của dữ liệu. Do đó, dữ liệu cần thường xuyên được theo dõi, kiểm tra,
rà soát, và cập nhật để phản ánh đúng giá trị mà nó đại diện.
b) Đảm bảo tính riêng tư và quyền khai thác dữ liệu của người sử dụng.
Mặc dù dữ liệu có tính chia sẻ, nhưng không phải tất cả dữ liệu đều được
chia sẻ, hoặc là không phải bất kỳ người sử dụng nào cũng có quyền khai
thác như nhau đối với một dữ liệu cụ thể. Người sử dụng không chỉ có thể
thiết lập các thông số liên quan đến việc chia sẻ dữ liệu dùng chung, mà còn
có thể cấp quyền và thu hồi quyền khai thác dữ liệu đối với những người
dùng khác trong hệ thống.
c) Đảm bảo giải quyết xung đột dữ liệu. Xuất phát từ việc dữ liệu được chia
sẻ, sự xung đột về quyền khai thác dữ liệu sẽ xuất hiện giữa những người
dùng khác nhau trong hệ thống. Cùng một dữ liệu đó, cùng lúc có nhiều yêu
cầu thực hiện thêm, sửa, hay xóa. Hệ thống nhìn chung không thể xử lý
đồng thời tất cả các yêu cầu đó cùng lúc. Do đó, chúng ta cần phải duy trì
cơ chế ưu tiên truy xuất dữ liệu cũng như cơ chế giải quyết tình trạng khóa
chết trong quá trình khai thác cạnh tranh.
d) Đảm bảo toàn vẹn dữ liệu khi có sự cố. Cơ sở dữ liệu thường được xem là
một bộ sưu tập dữ liệu trong một khoảng thời gian dài thường là vài năm,
vài chục năm, thậm chí cả trăm năm. Do đó, để đảm bảo dữ liệu được lưu
Email: namth@buh.edu.vn 7
trữ liên tục, chúng ta cần phải xây dựng cơ chế sao lưu, phục hồi nhằm đảm
bảo dữ liệu được nguyên vẹn và không bị gián đoạn trong trường hợp hệ
thống gặp sự cố.
Nói cách khác, hệ quản trị cơ sở dữ liệu là công cụ giúp người sử dụng hay các
chương trình ứng dụng tương tác với cơ sở dữ liệu. Cả ba yếu tố này hình thành
nên một hệ thống hướng cơ sở dữ liệu (xem hình 1.2).
Email: namth@buh.edu.vn 8
1.4.2 Phân loại
Thực tế, có rất nhiều tiêu chí có thể được sử dụng để phân loại các hệ quản trị cơ
sở dữ liệu. Ở đây, chúng tôi chỉ giới thiệu ba tiêu chí quan trọng nhất, đó là mô
hình dữ liệu, tính đa người dùng, và tính phân tán của hệ quản trị cơ sở dữ liệu.
Email: namth@buh.edu.vn 9
Hệ quản trị cơ sở dữ liệu phân tán (distributed data management
system): chứa dữ liệu và phần mềm hệ quản trị cơ sở dữ liệu tại nhiều
nơi khác nhau, kết nối với nhau thông qua đường truyền mạng.
Email: namth@buh.edu.vn 10
1.4.4 Cấu trúc tổng thể của hệ quản trị cơ sở dữ liệu
Một hệ quản trị cơ sở dữ liệu được phân thành nhiều phân hệ, mỗi phân hệ thực
hiện một chức năng trong hệ thống tổng thể. Hình 1.3 minh họa các thành phần cơ
bản của một hệ quản trị cơ sở dữ liệu.
Trong số các thành phần cấu thành nên hệ quản trị cơ sở dữ liệu, bản thân cơ sở dữ
liệu và từ điển dữ liệu thường được lưu trữ trên ổ đĩa cứng và do hệ điều hành
quản lý theo cơ chế input, output. Bộ quản lý dữ liệu lưu trữ cấp cao sử dụng các
thông tin về hệ quản trị cơ sở dữ liệu vốn được lưu trữ trên ở đĩa cứng. Đường kẻ
đứt nối và các điểm đánh dấu A, B, C, D, E cho biết tác động của bộ quản lý dữ
liệu lưu trữ cấp cao đối với hoạt động của hệ quản trị cơ sở dữ liệu. Nhiệm vụ
chính của bộ quản lý dữ liệu lưu trữ cấp cao là đảm bảo quá trình trao đổi dữ liệu
giữa ổ đĩa lưu trữ với dữ liệu của hệ thống thông qua việc quản lý hoạt động của
các bộ đệm trong bộ nhớ chính. Một khi dữ liệu nằm trong các bộ đệm của bộ nhớ
chính, không chỉ bản thân hệ quản trị cơ sở dữ liệu mà cả những trình ứng dụng
cũng có thể sử dụng dữ liệu này.
Trình biên dịch ngôn ngữ định nghĩa dữ liệu thực hiện các định nghĩa lược đồ
được khai báo trong các lệnh định nghĩa dữ liệu và lưu giữ thông tin về các lược
đồ này trong từ điển dữ liệu của hệ quản trị cơ sở dữ liệu. Từ điển dữ liệu về cơ
bản là nơi chứa đựng toàn bộ thông tin về cơ sở dữ liệu như là tên, kích thước các
tệp tin, tên và kiểu của các thực thể dữ liệu, thông tin về các lược đồ, các ràng
buộc trong cơ sở dữ liệu. Các thành phần của hệ quản trị cơ sở dữ liệu sẽ sử dụng
các thông tin trong từ điển dữ liệu mỗi khi có nhu cầu.
Bộ xử lý cơ sở dữ liệu chịu trách nhiệm xử lý các truy cập cơ sở dữ liệu mỗi khi
chúng xuất hiện. Nó tiếp nhận và thực thi các yêu cầu từ người sử dụng hoặc trình
ứng dụng thông qua các trình biên dịch tương ứng như là trình biên dịch ngôn ngữ
định nghĩa dữ liệu, trình biên dịch ngôn ngữ thao tác dữ liệu, trình biên dịch truy
Email: namth@buh.edu.vn 11
vấn, ... Các thành phần này phối hợp hoạt động thành một thể thống nhất, đảm bảo
thực hiện đầy đủ các chức năng của một hệ quản trị cơ sở dữ liệu.
Hình 1.3. Cấu trúc tổng thể của hệ quản trị cơ sở dữ liệu
Email: namth@buh.edu.vn 12
1.5.1 Nhóm quản trị cơ sở dữ liệu
Quản trị viên cơ sở dữ liệu là nhóm người dùng được phân quyền mạnh nhất trong
hệ thống hướng cơ sở dữ liệu, nhóm người dùng này có quyền thực hiện mọi thao
tác trên cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu và các phần mềm có liên quan
nhằm đảm bảo hoạt động hiệu quả, chính xác, nhanh chóng và liên tục của hệ
thống. Cụ thể, nhóm quản trị cơ sở dữ liệu có quyền thực hiện các hoạt động sau
đây:
Phân quyền truy cập cơ sở dữ liệu.
Giám sát quá trình vận hành cơ sở dữ liệu.
Sao lưu, khôi phục cơ sở dữ liệu.
Phân bổ tài nguyên phần cứng, phần mềm khi hệ thống có nhu cầu.
Chịu trách nhiệm trong trường hợp hệ thống có lỗ hổng bảo mật hoặc thời
gian đáp ứng chậm.
Email: namth@buh.edu.vn 13
1.5.3 Nhóm người dùng cuối
Người dùng cuối là nhóm người có nhu cầu truy cập cơ sở dữ liệu để thực hiện các
thao tác khai thác hay quản lý nội dung của cơ sở dữ liệu. cơ sở dữ liệu tồn tại
chính là để đáp ứng nhu cầu dữ liệu của nhóm người dùng này. Cụ thể, nhóm
người dùng cuối có nhu cầu thực hiện các thao tác sau đây:
Truy xuất dữ liệu phục vụ nhu cầu tương tác hoặc thống kê với nhiều khung
nhìn khác nhau.
Cập nhật dữ liệu theo hình thức trực tuyến hoặc theo phiên.
Tùy từng sự phân quyền, gán quyền cụ thể, người dùng cuối có thể tương tác trực
tiếp với cơ sở dữ liệu thông qua hệ quản trị cơ sở dữ liệu, hoặc tương tác gián tiếp
với cơ sở dữ liệu thông qua các chương trình ứng dụng có khai báo sử dụng cơ sở
dữ liệu.
1.5.4 Nhà phân tích hệ thống và nhân viên lập trình ứng dụng
Nhà phân tích hệ thống có nhiệm vụ xác định yêu cầu của những người dùng cuối
để xây dựng đặc tả các giao tác đáp ứng nhu cầu của họ. Sau đó, nhân viên lập
trình ứng dụng sử dụng những đặc tả này để hiện thực chương trình, và họ tiến
hành thử nghiệm, xử lý lỗi, lập tài liệu cũng như bảo trì những giao tác được xây
dựng sẵn này. Cả hai loại người dùng này thường được gọi chung là kỹ sư phần
mềm. Họ cần phải thật quen thuộc với cấu trúc của hệ quản trị cơ sở dữ liệu để
hoàn thành công việc của mình.
Email: namth@buh.edu.vn 14
Nhân viên thiết kế/ hiện thực hệ thống: làm nhiệm vụ thiết kế và hiện thực
giao diện và các chức năng của hệ quản trị cơ sở dữ liệu nhằm cung cấp cho
người sử dụng một phần mềm đóng gói hoàn chỉnh.
Nhân viên phát triển công cụ: làm nhiệm vụ thiết kế và hiện thực các gói
phần mềm đi kèm với hệ quản trị cơ sở dữ liệu nhằm nâng cao hiệu suất
trong thiết kế và sử dụng cơ sở dữ liệu. Chúng bao gồm các gói phần mềm
hỗ trợ việc thiết kế cơ sở dữ liệu, theo dõi hiệu suất, giao diện ngôn ngữ tự
nhiên, đồ họa, giả lập, mô phỏng, và thử nghiệm dữ liệu. Những công cụ đi
kèm này thường được các nhà cung cấp phát triển và đưa vào thị trường.
Hệ thống các hướng dẫn thực hiện mệnh lệnh do hệ quản trị cơ sở dữ liệu quy định
được thể hiện thông qua tập ngôn ngữ và các giao diện dành riêng cho từng nhóm
đối tượng người dùng. Chỉ những mệnh lệnh được quy định trong tập ngôn ngữ
này mới được hệ quản trị cơ sở dữ liệu thực thi, ngược lại, người sử dụng sẽ nhận
được thông báo lỗi tương ứng.
Trong phần này, chúng ta sẽ lần lượt tìm hiểu ba ngôn ngữ dữ liệu phổ biến nhất
được hệ quản trị cơ sở dữ liệu hỗ trợ người sử dụng:
Ngôn ngữ định nghĩa dữ liệu.
Ngôn ngữ thao tác dữ liệu.
Email: namth@buh.edu.vn 15
Ngôn ngữ điều khiển dữ liệu.
Thông qua ngôn ngữ định nghĩa dữ liệu, chúng ta có thể tạo mới, chỉnh sửa, và
xóa các lược đồ trong cơ sở dữ liệu. Do vai trò quan trọng của mình, cho nên ngôn
ngữ định nghĩa dữ liệu được dành riêng cho nhóm quản trị và thiết kế cơ sở dữ
liệu.
Email: namth@buh.edu.vn 16
1.6.4 Các giao diện ngôn ngữ dữ liệu
Để thuận tiện cho người sử dụng thực hiện các tác vụ trên cơ sở dữ liệu, hệ quản
trị cơ sở dữ liệu cung cấp các giao diện thích hợp cho từng nhóm người sử dụng
cơ sở dữ liệu cũng như cho từng ngôn ngữ dữ liệu.
Các loại giao diện được hệ quản trị cơ sở dữ liệu hỗ trợ hiện nay bao gồm:
Giao diện trình đơn dùng cho web client hay trình duyệt: loại này thường
gồm các danh mục lựa chọn gọi là trình đơn nhằm hướng dẫn người dùng
các bước tạo lập yêu cầu.
Giao diện form: để thêm dữ liệu vào, người dùng có thể điền đầy đủ thông
tin vào một form hướng dẫn. Ngoài ra, họ còn có thể điền chỉ một vài thông
tin vào form rồi yêu cầu hệ quản trị cơ sở dữ liệu thu thập những dữ liệu
trùng khớp với các mục đã điền. Các form thường xây dựng dành cho
những dùng thông thường với các giao tác đã được tạo sẵn.
Giao diện người dùng đồ họa: hiển thị mỗi lược đồ cho người dùng dưới
dạng sơ đồ. Người dùng sẽ đặc tả truy vấn bằng việc thao tác với các sơ đồ
này. Loại giao diện này thường bao gồm cả trình đơn và form.
Giao diện ngôn ngữ tự nhiên: loại này chấp nhận các yêu cầu bằng tiếng
Anh hay một ngôn ngữ khác. Một giao diện ngôn ngữ tự nhiên thường có
“lược đồ” của riêng nó, tương tự như lược đồ ý niệm cơ sở dữ liệu, và một
từ điển các từ vựng chính.
Giao diện này hoạt động bằng cách tham khảo các từ vựng trong lược đồ
của nó cũng như trong từ điển để thông dịch các yêu cầu. Nếu thông dịch
thành công, giao diện này sẽ sinh một truy vấn cấp cao tương ứng và gửi
đến hệ quản trị cơ sở dữ liệu yêu cầu xử lý. Ngược lại, giao diện sẽ phát
sinh một hộp thoại yêu cầu người dùng hiệu chỉnh yêu cầu.
Giao diện dành cho người dùng thông thường: những loại người dùng
thông thường như các giao dịch viên ngân hàng, thường chỉ có một số thao
tác lặp đi lặp lại trên cơ sở dữ liệu. Các nhà phân tích và thiết kế sẽ tạo cho
Email: namth@buh.edu.vn 17
mỗi nhóm người dùng này một loại giao diện đặc biệt bao gồm các câu lệnh
tắt giúp họ giảm bớt thời gian mô tả những tác vụ thường xuyên sử dụng.
Giao diện dành cho quản trị cơ sở dữ liệu: hầu hết hệ quản trị cơ sở dữ liệu
đều chứa một số câu lệnh cần quyền truy cập đặc biệt mà chỉ có quản trị cơ
sở dữ liệu mới có quyền thực hiện. Những câu lệnh này bao gồm việc tạo
tài khoản, thiết lập các thông số hệ thống, gán thông tin tài khoản, chỉnh
sửa lược đồ và tái tổ chức cấu trúc lưu trữ của cơ sở dữ liệu.
Email: namth@buh.edu.vn 18
C
CHHƯ
ƯƠƠN
NGG
2
MÔ HÌNH THỰC THỂ KẾT HỢP
Mục tiêu
Chương này tập trung nghiên cứu một phương pháp dùng để xác định cấu trúc của
cơ sở dữ liệu. Phương pháp này được xây dựng dựa trên mô hình thực thể kết hợp.
Đây được xem như là nhiệm vụ quan trọng đầu tiên mà nhân viên thiết kế dữ liệu
phải thực hiện trong quy trình phát triển cơ sở dữ liệu cho hệ thống thông tin.
Nội dung
Tổng quan về mô hình thực thể kết hợp.
Các vấn đề liên quan đến hoạt động thiết kế mô hình thực thể kết hợp.
Email: namth@buh.edu.vn 22
Giới thiệu
Mô hình thực thể kết hợp từ khi được ra đời đã được xem như là nền tảng của các
phương pháp phân tích và thiết kế hệ thống. Nó được sử dụng rộng rãi trong các
công cụ hỗ trợ công nghệ phần mềm (computer-aided software engineering, viết
tắt là CASE), và trong các hệ thống cơ sở dữ liệu. Mô hình này được xem là nền
tảng của mô hình chu trình phát triển ứng dụng và phần mềm hệ quản trị cơ sở dữ
liệu DB2 cùng của IBM.
Mặc dù hiện nay, trong thiết kế cơ sở dữ liệu người ta thường ưu tiên sử dụng
ngôn ngữ mô hình hóa hợp nhất (unified modelling language, viết tắt là UML),
nhưng mô hình thực thể kết hợp tỏ ra thích hợp hơn đối với những người mới bắt
đầu nghiên cứu về cơ sở dữ liệu và tìm cách xây dựng cơ sở dữ liệu đầu tiên cho
bản thân mình.
Chính vì lý do đó, chúng tôi chọn mô hình thực thể kết hợp làm đối tượng nghiên
cứu trong giáo trình này nhằm tạo điều kiện thuận lợi để người đọc có thể dễ dàng
tiếp cận và thực hiện thành thạo các thao tác đặc tả dữ liệu bằng ngôn ngữ mô hình
hóa theo hướng thực thể kết hợp.
Email: namth@buh.edu.vn 23
2.1 MÔ HÌNH THỰC THỂ KẾT HỢP
Như chúng ta đã biết, hầu hết các ứng dụng công nghệ thông tin hiện nay đều cần
sử dụng đến cơ sở dữ liệu cho dù với những mục đích khác nhau. Hai hệ thống
phần mềm có cùng chức năng những được áp dụng tại hai tổ chức khác nhau thì
không chỉ khác nhau về mặt tổ chức, mà còn có thể khác nhau về mặt dữ liệu. Nói
cách khác, cơ sở dữ liệu luôn phản ánh đúng thực trạng của tổ chức đang sử dụng
nó. Làm thế nào để chúng ta có thể đạt được một cơ sở dữ liệu thể hiện nguyên
vẹn tình trạng hiện tại của tổ chức và đáp ứng đầy đủ mọi nhu cầu về dữ liệu của
người sử dụng? Chúng ta nhất thiết cần phải xây dựng bản thiết kế cơ sở dữ liệu
cho tổ chức.
Mô hình thực thể kết hợp (entity relationship model) được xây dựng dựa trên sự
đặc tả thế giới thực bao gồm một tập các đối tượng cơ sở có tên gọi là tập thực thể,
và một tập các liên kết giữa các đối tượng này với nhau. Mô hình này còn được
gọi là mô hình ý niệm hay là mô hình khái niệm vì nó được xây dựng chủ yếu trên
nền tảng các khái niệm trong tổ chức, và thực tế, nó được dùng để biểu diễn cấu
trúc tổng thể của tổ chức. Mô hình thực thể kết hợp là một trong hai phương pháp
thiết kế cơ sở dữ liệu phổ biến nhất hiện nay (phương pháp còn lại sử dụng ngôn
ngữ mô hình hóa hợp nhất UML).
Mục đích của việc xây dựng mô hình thực thể kết hợp là cung cấp cho chúng ta
một bức tranh tổng thể về kết cấu dữ liệu của hệ thống, mà không quan tâm đến
việc sẽ hiện thực dữ liệu đó ra sao. Như vậy, mô hình thực thể kết hợp sẽ giúp
chúng ta trả lời câu hỏi trong cơ sở dữ liệu có những dữ liệu gì và chúng liên quan
với nhau ra sao, chứ không cho biết làm sao để đạt được cơ sở dữ liệu đó.
Email: namth@buh.edu.vn 24
2.2 MỘT ỨNG DỤNG CỦA MÔ HÌNH THỰC THỂ
KẾT HỢP
Để thuận lợi cho người đọc, trong toàn bộ giáo trình này chúng tôi sử dụng duy
nhất một cơ sở dữ liệu để minh họa cho mọi ví dụ. Cơ sở dữ liệu này xây dựng
dựa trên nhu cầu thực tế của một công ty chuyên về công nghệ thông tin, cụ thể
như sau:
Công ty được tổ chức thành nhiều đơn vị với các thông tin bao gồm: tên
đơn vị, số hiệu đơn vị. Mỗi đơn vị có thể có nhiều văn phòng đại diện tại
những địa điểm khác nhau. Đơn vị được quản lý bởi một nhân viên giữ
chức vụ trưởng đơn vị. Hệ thống cũng yêu cầu phải duy trì thông tin về
ngày ký quyết định bổ nhiệm cho từng trưởng đơn vị.
Mỗi đơn vị điều hành nhiều dự án. Thông tin về dự án bao gồm: tên dự án,
số hiệu, và địa điểm thực hiện dự án.
Công ty duy trì thông tin về nhân viên bao gồm: họ và tên, mã số, mức
lương, giới tính, ngày sinh và ngày ký hợp đồng làm việc với công ty. Mỗi
nhân viên thuộc biên chế một đơn vị nhưng có thể tham gia nhiều dự án
khác nhau. Các dự án này không nhất thiết phải do cùng một đơn vị quản
lý. Công ty cũng theo dõi thời gian (tính bằng số giờ làm việc trong tuần)
tham gia từng dự án của mỗi nhân viên. Ngoài ra, mỗi nhân viên còn chịu
sự giám sát của một nhân viên khác.
Cuối cùng, công ty có chế độ bảo hiểm dành cho người thân của nhân viên.
Thông tin về người thân bao gồm tên, giới tính, ngày sinh và mối liên hệ
với nhân viên.
Do hầu hết các hệ quản trị cơ sở dữ liệu cũng như các công cụ phát triển phần
mềm được xây dựng trên nền ngôn ngữ tiếng Anh, cho nên chúng ta cũng cần ánh
xạ tất cả thông tin được yêu cầu trên đây sang ngôn ngữ tiếng Anh để thuận tiện
trong quá trình cài đặt và sử dụng sau này. Từ bản đặc tả nói trên, chúng ta nhận
Email: namth@buh.edu.vn 25
thấy trong cơ sở dữ liệu COMPANY có bốn nhóm đối tượng cơ sở (cùng các
thông tin đi kèm) được liệt kê sau đây:
Đơn vị Department
Tên đơn vị DName
Số hiệu đơn vị DNumber
Các địa điểm DLocation
Dự án Project
Tên dự án PName
Số hiệu dự án PNumber
Địa điểm PLocation
Nhân viên Employee
Họ và tên EName
Mã số ESSN
Giới tính ESex
Mức lương ESalary
Ngày sinh EBirthdate
Ngày bắt đầu EStartdate
Thân nhân Dependent
Tên DName
Giới tính DSex
Ngày sinh DBirthdate
Mối liên hệ DRelationship
Bên cạnh đó, sau khi phân tích bản đặc tả, chúng ta cũng phát hiện ra được các
mối liên quan giữa các đối tượng cơ sở với nhau. Chúng được này được trình bày
theo tên theo sau là các đối tượng cơ sở. Cụ thể như sau:
Quản lý Manage
Đơn vị Department
Nhân viên Employee
Email: namth@buh.edu.vn 26
Điều hành Control
Đơn vị Department
Dự án Project
Biên chế Works for
Đơn vị Department
Nhân viên Employee
Tham gia Works on
Nhân viên Employee
Dự án Project
Giám sát Supervise
Nhân viên Employee
Nhân viên Employee
Phụ thuộc Belong to
Nhân viên Employee
Thân nhân Dependent
Tiếp theo, để làm quen với mô hình thực thể kết hợp, chúng ta tìm hiểu các thành
phần cơ bản tạo nên mô hình này và các định nghĩa khác có liên quan tới việc thiết
kế mô hình thực thể kết hợp.
Các thực thể được phân biệt với nhau nhờ các đặc trưng của nó. Hai thực thể khác
nhau thì phải có ít nhất một đặc trưng có giá trị khác nhau. Người ta gọi mỗi đặc
Email: namth@buh.edu.vn 27
trưng của thực thể là một thuộc tính của thực thể đó. Khi xác định thuộc tính cho
một kiểu thực thể, chúng ta cần phải lựa chọn miền giá trị cho thuộc tính đó. Miền
giá trị của một thuộc tính thực chất là tập hợp các giá trị mà thuộc tính đó có thể
nhận được. Miền giá trị có thể là tập các số nguyên, các số thực, các xâu ký tự,
hoặc là tập liệt kê một số giá trị cụ thể. Miền giá trị cũng có thể là một tích
Decartes của nhiều tập giá trị khác nhau. Tập thực thể là tập hợp các thực thể có
cùng kiểu thực thể.
Trong mô hình thực thể kết hợp mỗi thuộc tính biểu diễn một đặc trưng riêng của
tập thực thể và mỗi thực thể có một giá trị tại từng thuộc tính này. Thuộc tính tổ
hợp là thuộc tính có thể phân thành nhiều thuộc tính nhỏ hơn. Trong khi đó, thuộc
tính không thể phân rã được nữa gọi là thuộc tính đơn. Thuộc tính tổ hợp có lúc
Email: namth@buh.edu.vn 28
được dùng như một thuộc tính đơn, tuy nhiên, trong nhiều trường hợp chúng ta lại
quan hệ tới từng thành phần riêng lẻ của nó.
Một thực thể tại mỗi thuộc tính có một giá trị tương ứng. Trong nhiều trường hợp,
giá trị này là một giá trị đơn, và chúng ta gọi là thuộc tính đơn trị. Tuy nhiên, cũng
có trường hợp, giá trị của một thuộc tính không phải là giá trị đơn, mà là một tập
hợp của nhiều giá trị đơn. Khi đó, thuộc tính được gọi là đa trị. Mỗi thuộc tính đa
trị có thể có giới hạn trên và giới hạn dưới để ràng buộc số giá trị tối đa và tối
thiểu của thuộc tính đó trong từng thực thể.
Như đã trình bày ở trên, thuộc tính cho biết đặc trưng của thực thể, giá trị của
thuộc tính dùng để phân biệt các thực thể với nhau, và được lưu trữ trong cơ sở dữ
liệu. Thuộc tính lưu trữ là thuộc tính mà giá trị của nó không phụ thuộc vào bất cứ
thuộc tính nào khác. Trong khi đó, thuộc tính dẫn xuất là thuộc tính mà giá trị có
Email: namth@buh.edu.vn 29
được là do kết quả của phép tính toán dựa trên các thuộc tính khác. Đôi khi, người
ta còn gọi thuộc tính lưu trữ là thuộc tính độc lập còn thuộc tính dẫn xuất là thuộc
tính phụ thuộc.
Nói đến một thực thể cụ thể, tức là chúng ta nói đến giá trị tại các thuộc tính của
thực thể đó. Tuy nhiên, với một số thuộc tính của thực thể, chúng ta có thể không
biết giá trị của chúng có tồn tại hay không, hoặc nếu tồn tại thì không biết cụ thể là
gì, hay không thể sử dụng các giá trị đó ở thời điểm hiện tại, … Khi đó, chúng ta
có thể sử dụng một giá trị đặc biệt, đó là giá trị null với nhiều cách diễn giải khác
nhau: giá trị không biết, giá trị tồn tại nhưng không xác định, hoặc thuộc tính
tương ứng không áp dụng cho thực thể đang xem xét.
Trong mô hình thực thể kết hợp, chúng ta không biểu diễn các thực thể riêng lẻ.
Có nghĩa là, giả sử chúng ta có 5 thực thể phân biệt có cùng các thuộc tính là
Name, Number, Location, thì không nhất thiết chúng ta phải thể hiện cả 5 thực thể
Email: namth@buh.edu.vn 30
đó trên mô hình. Thay vào đó, chúng ta chỉ cần biểu diễn một khái niệm đại diện
cho cả 5 thực thể giống nhau đó. Khái niệm này được gọi là tập thực thể
DEPARTMENT. Tập thực thể được định nghĩa như là một nhóm các thực thể có
các thuộc tính giống nhau. Để biểu diễn tập thực thể, chúng ta cần cung cấp tên
gọi (duy nhất) và danh sách các thuộc tính của tập thực thể đó.
Hình 2.1. Biểu diễn các tập thực thể trong CSDL COMPANY.
Như đã trình bày, tập thực thể là tập hợp các thực thể có cùng các thuộc tính. Theo
khái niệm tập hợp, hai phần tử trong cùng tập hợp thì không thể giống nhau. Do
Email: namth@buh.edu.vn 31
đó, hai thực thể trong một tập thực thể cũng không thể giống nhau. Mỗi thực thể
được phân biệt bởi một bộ giá trị ứng với các thuộc tính của nó. Vì thế, hai thực
thể trong một tập thực thể phải có ít nhất một giá trị khác nhau trong hai bộ giá trị
tương ứng của chúng. Nói cách khác, hai thực thể này phải khác nhau ở tại ít nhất
một thuộc tính (gọi là thuộc tính phân biệt).
Nếu trong tập thực thể có một thuộc tính có khả năng phân biệt tất cả các thực thể
trong tập thực thể đó, thì thuộc tính đó được gọi là khóa của tập thực thể. Tuy
nhiên, không phải lúc nào trong tập thực thể cũng tồn tại một thuộc tính như thế.
Khi đó, chúng ta phải tìm kiếm một tập hợp gồm nhiều thuộc tính có khả năng
phân biệt hai thực thể bất kỳ, và cũng gọi chúng là khóa của tập thực thể.
Một cách khái quát, trong một tập thực thể, luôn tồn tại một tập hợp gồm ít nhất
một thuộc tính có khả năng phân biệt hai thực thể bất kỳ trong tập thực thể đó. Tập
hợp các thuộc tính này được gọi là khóa của tập thực thể đang xét.
Email: namth@buh.edu.vn 32
VÍ DỤ 2.9: Khóa chính và khóa phụ của tập thực thể.
Trong tập thực thể PROJECT, với giả định như trong ví dụ 2.8, tập các thuộc tính
{PName, PLocation} là một khóa. Ngoài ra, trong tập thực thể này, không thể có
hai thực thể có giá trị bằng nhau tại thuộc tính PNumber, PNumber là một khóa
khác của PROJECT. Chúng ta chọn PNumber là khóa chính, trong khi {PName,
PLocation} là khóa phụ của tập thực thể PROJECT.
2.3.2 Các liên kết
2.3.2.1 Định nghĩa
Trong định nghĩa về cơ sở dữ liệu chúng ta có phát biểu rằng cơ sở dữ liệu là một
tập hợp nhiều dữ liệu có mối liên quan về mặt ý nghĩa với nhau. Mặt khác, mô
hình thực thể kết hợp phản ánh thế giới thực mà cơ sở dữ liệu muốn lưu trữ. Vậy,
làm thế nào để mô hình thực thể kết hợp có thể phản ánh được các mối liên quan
về mặt ý nghĩa của các dữ liệu, mà cụ thể là mối liên quan giữa các tập thực thể?
Các liên kết được sử dụng để thực hiện nhiệm vụ đó.
Theo đó, một liên kết là một sự kết hợp giữa một số thực thể. Các thực thể này có
thể thuộc các tập thực thể khác nhau, hoặc thuộc cùng một tập thực thể. Một kiểu
liên kết giữa các tập thực thể được định nghĩa như là tập hợp các liên kết giữa các
thực thể thuộc các tập thực thể nói trên.
Xét theo quan điểm toán học, kiểu liên kết R giữa các tập thực thể E1, E2, …, En
thực chất là một quan hệ toán học trên E1, E2, …, En và được ký hiệu là
R⊆E1×E2×…×En. Trong đó, mỗi liên kết ri ⊆ R kết hợp n thực thể e1, e2, …, en với
nhau (ei ∈ Ei) và được gọi là một thể hiện của kiểu liên kết R. Vì kiểu liên kết R có
sự tham gia của n tập thực thể, nên R còn gọi là liên kết bậc n. Nói cách khác, bậc
của kiểu liên kết chính là số tập thực thể tham gia trong liên kết đó.
Email: namth@buh.edu.vn 33
VÍ DỤ 2.10: Liên kết hai ngôi.
Trong COMPANY ứng với mỗi mối liên quan giữa các đối tượng cơ sở chúng ta
tạo một kiểu liên kết cùng tên kèm theo các tập thực thể tham gia trong kiểu liên
kết đó. Ví dụ, chúng ta có kiểu liên kết MANAGES giữa hai tập thực thể
DEPARTMENT và EMPLOYEE. Đây là kiểu liên kết bậc hai (còn gọi là hai
ngôi) do có hai tập thực thể tham gia trong liên kết.
2.3.2.2 Phân loại
Để đảm bảo mối liên hệ về mặt ngữ nghĩa của các kiểu thực thể, chúng ta cần phải
chọn lựa kiểu liên kết cũng như các kiểu thực thể tham gia trong các kiểu liên kết
đó. Người ta tiến hành phân loại các kiểu liên kết chủ yếu dựa trên số lượng các
tập thực thể tham gia trong một liên kết: liên kết bậc 2 (liên kết hai ngôi) và liên
kết bậc cao (từ 3 trở lên). Thực tế liên kết bậc 2 là loại liên kết phổ biến nhất,
trong khi một liên kết bậc cao có thể được phân tách thành nhiều liên kết bậc 2 mà
vẫn đảm bảo đầy đủ ý nghĩa của liên kết. Ví dụ sau đây sẽ cho chúng ta thấy cách
thức chuyển đổi một liên kết bậc 3 thành 3 liên kết bậc 2.
VÍ DỤ 2.11: Phân rã liên kết nhiều ngôi thành nhiều liên kết hai ngôi.
Giả sử trong COMPANY chúng ta định nghĩa thêm tập thực thể REPORT nhằm
mục đích thể hiện các báo cáo mà mỗi nhân viên đã thực hiện theo định kỳ cho
từng dự án mà họ tham gia. Rõ ràng trong trường hợp này, kiểu liên kết WORKS
ON có sự tham gia của ba tập thực thể là EMPLOYEE, PROJECT, và
REPORT. Chúng ta có thể phân tách kiểu liên kết 3 ngôi này thành các kiểu liên
kết 2 ngôi bằng cách thay thế kiểu liên kết WORKS ON bằng tập thực thể
WORKS ON, sau đó, tạo 3 liên kết 2 ngôi giữa WORKS ON với lần lượt
EMPLOYEE, PROJECT, và REPORT.
Email: namth@buh.edu.vn 34
Hình 2.2. Biến đổi liên kết ba ngôi thành các liên kết hai ngôi
Tiếp theo, chúng ta tìm cách phân loại các kiểu liên kết 2 ngôi dựa trên số lượng
các thực thể tham gia trong một liên kết. Giá trị này được thể hiện bằng một con
số được biểu diễn ngay trên mô hình thực thể kết hợp. Chúng ta có ba trường hợp
phân biệt: liên kết một – một, liên kết một – nhiều và liên kết nhiều – nhiều:
a) Liên kết một – một là dạng liên kết đơn giản nhất của kiểu liên kết hai ngôi.
Nó diễn tả mối quan hệ giữa một thực thể trong tập thực thể này với nhiều nhất
một thực thể trong tập thực thể kia và ngược lại.
Hình 2.3. Biểu diễn liên kết một – một trong CSDL COMPANY
Email: namth@buh.edu.vn 35
b) Liên kết một – nhiều là loại liên kết mà trong đó một thực thể trong tập thực
thể E2 được kết hợp với nhiều thực thể trong tập thực thể E1, nhưng mỗi thực
thể trong tập thực thể E1 chỉ kết hợp với nhiều nhất một thực thể trong tập thực
thể E2. Loại liên kết này được gọi là liên kết nhiều – một từ E1 đến E2.
Hình 2.4. Biểu diễn liên kết một – nhiều trong CSDL COMPANY
c) Liên kết nhiều – nhiều là loại liên kết mà trong đó không có sự giới hạn về số
lượng thực thể trong mỗi tập thực thể tham gia. Nói cách khác, với kiểu liên
kết nhiều – nhiều giữa hai tập thực thể E1 và E2, chúng ta có thể hiểu là mỗi
thực thể trong tập thực thể E1 có thể kết hợp với nhiều thực thể trong tập thực
thể E2 và ngược lại.
Hình 2.5. Biểu diễn liên kết nhiều – nhiều trong CSDL COMPANY
Email: namth@buh.edu.vn 36
2.3.2.3 Thuộc tính của liên kết và vai trò của tập thực thể trong liên kết
Khi thể hiện kiểu liên kết trong mô hình thực thể kết hợp, để người đọc có thể hiểu
chính xác về nhiệm vụ của từng tập thực thể trong liên kết chúng ta xác định vai
trò của từng tập thực thể tham gia trong liên kết đó.
Hình 2.6. Biểu diễn vai trò của tập thực thể trong liên kết
Rõ ràng, với vai trò supervisor, một nhân viên là lãnh đạo trực trực tiếp của không
hoặc nhiều nhân viên khác. Ngược lại, với vai trò supervisee, một nhân viên chịu
sự quản lý của nhiều nhất một nhân viên khác.
Trong mô hình thực thể kết hợp, thuộc tính không chỉ được dùng để thể hiện đặc
trưng của tập thực thể, mà nó còn được dùng để bổ sung thông tin cho kiểu liên
kết. Trong trường hợp sau, thuộc tính được gọi là thuộc tính của kiểu liên kết,
thuộc tính gắn với liên kết. Ví dụ 2.16 sẽ cho chúng ta biết tại sao phải sử dụng
thuộc tính của kiểu liên kết mà không phải là thuộc tính của tập thực thể.
Email: namth@buh.edu.vn 37
thuộc tính này gắn liền với tập thực thể nào, EMPLOYEE hay PROJECT? Nếu
đây là thuộc tính của EMPLOYEE, nghĩa là mỗi nhân viên có một giá trị duy
nhất tại thuộc tính Hours. Phải chăng mọi nhân viên đều tham gia các dự án với số
giờ lao động bằng nhau và bằng chính giá trị tại thuộc tính Hours? Điều này là
không thực tế. Tương tự, nếu Hours là thuộc tính của PROJECT, chẳng lẽ mọi
nhân viên tham gia một dự án đều có số giờ lao động bằng nhau và bằng chính giá
trị tại thuộc tính Hours của dự án đó? Điều này cũng phi lý. Như vậy, thuộc tính
Hours không là thuộc tính của EMPLOYEE, mà cũng không là thuộc tính của
PROJECT. Nó là thuộc tính của kiểu liên kết WORKS ON, nó bổ sung thông tin
cho liên kết này với đúng ý nghĩa của liên kết này: mỗi liên kết trong kiểu liên kết
WORKS ON cho biết sự kết hợp giữa một nhân viên và một dự án.
Hình 2.7. Biểu diễn thuộc tính của liên kết WOKRSON trong CSDL COMPANY.
2.3.3 Tập thực thể yếu
Trong quá trình định danh các tập thực thể và các kiểu liên kết giữa các tập thực
thể, chúng ta nhận thấy có trường hợp tập thực thể E1 phụ thuộc chặt chẽ vào tập
thực thể E2 thông qua kiểu liên kết R. Sự phụ thuộc này có thể được diễn tả như
sau: mỗi thực thể e2 trong E2 kết hợp với nhiều thực thể e1 trong E1 theo các liên
kết r trong R. Khi thực thể e2 bị xóa ra khỏi E2, tất cả các thực thể e1 và các liên
kết r nói trên đều lần lượt bị xóa ra khỏi E1 và R mà không có bất kỳ sự lựa chọn
nào khác. Khi đó, người ta gọi E1 là tập thực thể yếu, R là kiểu liên kết hỗ trợ, và
E2 là tập thực thể hỗ trợ. Ví dụ sau đây minh họa chi tiết một tập thực thể yếu
trong COMPANY.
Email: namth@buh.edu.vn 38
VÍ DỤ 2.17: Tập thực thể yếu.
Trong COMPANY, tập thực thể DEPENDENT cho biết thông tin về người thân
của mỗi nhân viên thông qua kiểu liên kết BELONG TO. Rõ ràng, mỗi nhân viên
có nhiều người thân, ngược lại, mỗi người thân chỉ có quan hệ gia đình với một
nhân viên nào đó. Giả sử một nhân viên tên An có hai người thân tên gọi lần lượt
là Bình và Lành. Điều gì xảy ra với hai thực thể ứng với hai người thân tên Bình
và Lành nếu thực thể ứng với nhân viên tên An bị xóa khỏi tập thực thể
EMPLOYEE? Rõ ràng, lúc này người tên An không còn là nhân viên của công ty,
và như vậy, không có lý do gì để công ty duy trì thông tin về những người thân
của anh ta. Kết quả, hai thực thể ứng với hai người thân tên Bình và Lành bị xóa ra
khỏi tập thực thể DEPENDENT. Chính vì sự phụ thuộc chặt chẽ này, cho nên tập
thực thể DEPENDENT được gọi là tập thực thể yếu, còn HAS và EMPLOYEE
có tên gọi lần lượt là kiểu liên kết hỗ trợ, và tập thực thể hỗ trợ.
Hình 2.8. Biểu diễn tập thực thể yếu DEPENDENT trong CSDL COMPANY
Như vậy, tập thực thể E1 được gọi là yếu khi nó phụ thuộc vào tập thực thể E2
thông qua một kiểu liên kết hỗ trợ có tên là R. Các điều kiện sau đây xác định E1 là
tập thực thể yếu và R là kiểu liên kết hỗ trợ:
Kiểu liên kết R là loại liên kết hai ngôi nhiều – một từ E1 đến E2
Tập thực thể E1 không có khóa, nó phải nhận khóa từ tập thực thể E2 về làm
khóa cho nó.
Email: namth@buh.edu.vn 39
VÍ DỤ 2.18: Khóa của tập thực thể yếu.
Tập thực thể DEPENDENT không có khóa, do đó nó phải nhận khóa từ tập thực
thể EMPLOYEE về làm khóa. Như vậy, khóa của DEPENDENT là {ESSN,
DName}.
Bảng 2.1 tóm tắt lại toàn bộ ký hiệu được sử dụng trong mô hình thực thể kết hợp
và ý nghĩa của chúng.
2.4.2 Quy tắc đặt tên trong mô hình thực thể kết hợp
Trong quá trình thiết kế cơ sở dữ liệu nói chung và mô hình thực thể kết hợp nói
riêng, việc xác định tên gọi cho các tập thực thể, thuộc tính, kiểu liên kết và các
vai trò không phải lúc nào cũng thuận lợi. Bản thiết kế của chúng ta phải vừa rõ
ràng, mạch lạc, đầy đủ ý nghĩa vì không phải chỉ chúng ta, những người thiết kế,
sử dụng nó, mà còn nhiều nhóm người dùng khác cũng có nhu cầu tham khảo nó.
Chúng ta có xu hướng đặt tên cho các thành phần trong mô hình thực thể kết hợp
bằng các từ ngữ có ý nghĩa, càng đơn giản càng tốt. Chúng ta nên chọn tên tập
thực thể là các danh từ số ít, bởi vì tên tập thực thể thường áp dụng cho từng thực
thể riêng lẻ của tập thực thể đó. Ngoài ra, chúng ta quy ước sử dụng chữ in hoa để
Email: namth@buh.edu.vn 40
biểu diễn tên tập thực thể và tên kiểu liên kết, chữ in thường để thể hiện các vai
trò; với thuộc tính, ký tự đầu tiên ghi hoa, các ký tự khác ghi thường.
Thực tế, khi đọc một bản đặc tả yêu cầu dữ liệu của hệ thống, chúng ta hoàn toàn
có đầy đủ cơ sở để xây dựng được mô hình thực thể kết hợp đáp ứng đầy đủ các
yêu cầu đặt ra. Nhìn chung, các danh từ chung chỉ sự vật, hiện tượng cần được ghi
nhận chính là các tập thực thể; các tính từ, hoặc các danh từ diễn tả tính chất, hoặc
đặc trưng thường là các thuộc tính; các động từ thể hiện mối liên quan giữa các tập
thực thể chính là kiểu liên kết.
Bảng 2.1. Tóm tắt các ký hiệu trong mô hình thực thể kết hợp
Thuộc tính
Email: namth@buh.edu.vn 41
Một nguyên tắc quan trọng khi trình bày mô hình thực thể kết hợp đó là các mô
hình của chúng ta được thiết kế để có thể đọc được từ trái sang phải, từ trên xuống
dưới theo chiều hướng của các kiểu liên kết. Chính vì vậy, đôi khi chúng ta phải
đặt lại tên cho kiểu liên kết để có thể đáp ứng được yêu cầu này.
Như vậy, sau khi tổng hợp tất cả các vấn đề đã trình bày ở trên, chúng ta có mô
hình thực thể kết hợp hoàn chỉnh cho cơ sở dữ liệu COMPANY giới thiệu ở mục
2.2.
Hình 2.9. Biểu diễn cơ sở dữ liệu COMPANY bằng mô hình thực thể kết hợp.
Email: namth@buh.edu.vn 42
sở dữ liệu. Chúng ta phân biệt các thực thể trong tập thực thể bởi các giá trị tại các
thuộc tính của chúng. Trong khi thuộc tính biểu diễn các đặc trưng, tính chất của
tập thực thể, kiểu liên kết lại được sử dụng để mô tả mối liên quan giữa các tập
thực thể với nhau. Tùy theo số lượng các tập thực thể tham gia trong kiểu liên kết
mà chúng ta xác định bậc của kiểu liên kết. Riêng đối với kiểu liên kết hai ngôi,
chúng ta còn xác định được lực lượng của từng tập thực thể tham gia trong liên
kết. Nhờ đó, chúng ta phân biệt ba loại kiểu liên kết hai ngôi: một – một, một –
nhiều, và nhiều – nhiều. Cuối cùng, chúng ta định nghĩa một kiểu liên kết hai ngôi
nhiều – một đặc biệt, kiểu liên kết hỗ trợ. Một kiểu liên kết gọi là hỗ trợ khi nó thể
hiện mối quan hệ phụ thuộc giữa hai tập thực thể: các thực thể trong tập thực thể
này tồn tại hay không là do một thực thể trong tập thực khác quyết định.
Email: namth@buh.edu.vn 43
C
CHHƯ
ƯƠƠN
NGG
3
MÔ HÌNH
THỰC THỂ KẾT HỢP MỞ RỘNG
Mục tiêu
Người đọc được trang bị các kiến thức về mô hình thực thể kết hợp mở rộng với
các khái niệm về sự kế thừa, quá trình khái quát hóa và chuyên biệt hóa, các loại
ràng buộc không trùng lắp, ràng buộc toàn phần, … nhằm giải quyết một lớp yêu
cầu dữ liệu mà mô hình thực thể kết hợp không thể đáp ứng được.
Nội dung
Những hạn chế của mô hình thực thể kết hợp.
Các thành phần của mô hình thực thể kết hợp mở rộng.
Email: namth@buh.edu.vn 49
Giới thiệu
Mô hình thực thể kết hợp mở rộng, đúng khi tên gọi của nó, là một sự mở rộng từ
mô hình thực thể kết hợp với các khái niệm có liên quan đến mối liên kết cha/con
giữa các tập thực thể. Mối liên kết này được thể hiện thông qua hai quá trình:
chuyên biệt hóa và khái quát hóa. Hai quá trình này được tiến hành ngược nhau,
nếu quá trình chuyên biệt hóa tạo các lớp con từ một lớp cha, thì quá trình khái
quát hóa tạo lớp cha từ các lớp con. Các quá trình này có thể dựa trên các ràng
buộc trên thuộc tính hoặc do người sử dụng tự định nghĩa. Ngoài ràng buộc trên
thuộc tính, trong chuyên biệt hóa còn có hai ràng buộc khác, đó là ràng buộc
không trùng lắp và ràng buộc toàn phần. Các ràng buộc này quyết định hành vi
thêm mới hay xóa bỏ thực thể ra khỏi các lớp trong mối liên kết cha/con.
Với mô hình thực thể kết hợp mở rộng, chúng ta có thể giải quyết các vấn đề phát
sinh khi sử dụng mô hình thực thể kết hợp để thiết kế dữ liệu cho các hệ thống lớn,
phức tạp, nhiều tầng nhiều lớp.
Email: namth@buh.edu.vn 50
3.1 NHỮNG HẠN CHẾ CỦA MÔ HÌNH THỰC THỂ
KẾT HỢP
Mô hình thực thể kết hợp được xem là phương pháp đơn giản nhất để thiết kế cấu
trúc dữ liệu dựa trên yêu cầu của người sử dụng. Phương pháp này được sử dụng
rộng rãi trong quá khứ khi chúng ta có nhu cầu thiết kế cơ sở dữ liệu cho các hệ
thống sử dụng cơ sở dữ liệu đơn giản, một cấp. Tuy nhiên, có những vấn đề phát
sinh khi áp dụng phương pháp này trong việc xây dựng các cơ sở dữ liệu phức tạp,
đa cấp.
Ở phần cuối chương hai, chúng ta đã đề xuất một bản thiết kế cơ sở dữ liệu sử
dụng mô hình thực thể kết hợp cho ví dụ mẫu được trình bày trong mục 2.2. Bây
giờ, chúng ta bổ sung thêm một số yêu cầu cho phần đặc tả dữ liệu, và tìm cách
hiện thực hóa các yêu cầu đó bằng mô hình thực thể kết hợp:
Nhân viên trong công ty được phân chia làm nhiều nhóm khác nhau, dựa
vào nhiệm vụ mà từng nhân viên đảm nhận trong công ty. Chúng ta có ba
nhóm nhân viên: nhân viên văn phòng, nhân viên kỹ thuật và nhân viên lái
xe. Mỗi nhóm nhân viên ngoài những đặc trưng chung của một nhân viên,
còn có các đặc trưng riêng.
Công ty duy trì thông tin về người thân đối với nhân viên trong nhóm kỹ sư
thay vì đối với toàn bộ nhân viên trong công ty.
Chỉ với hai yêu cầu đặc tả tương đối đơn giản trên đây, mô hình thực thể kết hợp
đã bộc lộ một số nhược điểm của nó:
Để mô tả các nhóm nhân viên với những đặc tính khác nhau, chúng ta cần
tạo những tập thực thể khác nhau (1). Cụ thể ở đây, ngoài tập thực thể
EMPLOYEE, chúng ta cần phải sử dụng thêm ba tập thực thể khác lần
lượt là SECRETARY, ENGINEER và DRIVER. Ba tập thực thể có các
thuộc tính của riêng nó và các thuộc tính chung tương tự như
EMPLOYEE. Tiếp theo, với mối quan hệ được mô tả giữa các tập thực thể
Email: namth@buh.edu.vn 51
này với nhau, chúng ta nhận thấy, mỗi nhân viên chỉ có thể đảm nhiệm một
công việc trong công ty mà thôi, nếu người này là nhân viên kỹ thuật thì
không thể là nhân viên hành chính hay nhân viên lái xe được. Do đó, mỗi
thực thể trong EMPLOYEE chỉ có thể xuất hiện duy nhất một lần ở đâu đó
trong SECRETARY, ENGINEER, và DRIVER. Mô hình thực thể kết
hợp không thể biểu diễn được các mối quan hệ dạng như thế này.
Để mô tả các nhóm nhân viên với những đặc tính khác nhau, chúng ta tạo
một tập thực thể EMPLOYEE duy nhất chứa tất cả thuộc tính của các
nhóm nhân viên nói trên (2). Khi đó, thuộc tính riêng của nhóm sẽ giúp xác
định một thực thể trong EMPLOYEE thuộc nhóm nào. Tuy nhiên, trong
trường hợp này, chúng ta không thể diễn giải trên mô hình mối quan hệ
giữa hai tập thực thể EMPLOYEE và DEPENDENT. Công ty chỉ muốn
duy trì thông tin về người thân của kỹ sư mà thôi.
Từ (1) và (2) chúng ta thấy rằng, mô hình thực thể kết hợp chỉ thích hợp đối với
những dữ liệu ngang hàng và đơn giản. Mô hình này không thể biểu diễn được dữ
liệu phân cấp, một trong những đặc điểm cơ bản của hầu hết các cơ sở dữ liệu ứng
dụng hiện nay. Mô hình thực thể kết hợp mở rộng là sự lựa chọn cần thiết, giúp
giải quyết các vấn đề mà mô hình thực thể kết hợp (cổ điển) không thể giải quyết.
Email: namth@buh.edu.vn 52
3.2.1 Lớp con, lớp cha và sự kế thừa
Một trong những khái niệm quan trọng nhất của mô hình thực thể kết hợp mở rộng
đó là khái niệm về lớp con của một tập thực thể. Như chúng ta đã định nghĩa ở
chương trước, tập thực thể là một tập hợp các thực thể được xác định bởi các
thuộc tính giống nhau được lưu trữ trong cơ sở dữ liệu. Trong nhiều trường hợp,
một tập thực thể có thể được phân chia làm nhiều nhóm thực thể khác nhau, từng
thành viên trong mỗi nhóm đều thuộc tập thực thể ban đầu. Sự phân nhóm này dựa
trên một số đặc trưng nào đó, và cần được biểu diễn một cách tường minh. Người
ta gọi mỗi nhóm được phân tách là lớp con, còn tập thực thể ban đầu được gọi là
lớp cha trong phép phân nhóm nói trên. Mối liên kết từ lớp cha đến từng lớp con
được gọi là mối liên kết lớp cha/lớp con hay gọi tắt là liên kết cha/con. Loại liên
kết này còn có tên gọi khác là liên kết ISA (is a part of).
VÍ DỤ 3.1: Liên kết cha/con trong mô hình thực thể kết hợp mở rộng.
Các thực thể trong tập thực thể EMPLOYEE được trình bày trong cơ sở dữ liệu
COMPANY có thể được phân biệt thành nhiều nhóm khác nhau dựa vào đặc thù
của công việc được giao, như là ENGINEER (kỹ sư), SECRETARY (thư ký), và
DRIVER (lái xe). Trong trường hợp này EMPLOYEE gọi là lớp cha, còn các tập
thể ENGINEER, SECRETARY và DRIVER có chung tên gọi là lớp con trong
phép phân nhóm dựa trên đặc thù công việc được giao. Trong ví dụ này, chúng ta
có ba mối liên kết cha/con giữa EMPLOYEE và ENGINEER, giữa
EMPLOYEE và SECRETARY, giữa EMPLOYEE và DRIVER.
Hình 3.1. Các mối liên kết cha/con trong CSDL COMPANY
Email: namth@buh.edu.vn 53
Một điều quan trọng mà chúng ta cần phải ghi nhớ là trong mối liên kết cha con,
mỗi thực thể của lớp con biểu diễn cùng một sự vật trong thế giới thực với một
thực thể nào đó của lớp cha. Nếu trong lớp con ENGINEER có một thực thể với
giá trị tại thuộc tính EName là ‘Lê Duy Anh’, thì trong lớp cha EMPLOYEE cũng
có một thực thể có giá trị tương tự tại thuộc tính EName. Vì vậy, mỗi thực thể của
lớp con là một thực thể trong lớp cha, nhưng với một vai trò đặc biệt. Nói cách
khác, vai trò đặc biệt này chính là đặc trưng được dùng để phân chia các thực thể
của lớp cha thành nhiều lớp con. Ngoài ra, một thực thể của lớp cha, có thể xuất
hiện trong nhiều lớp con hoặc không thuộc lớp con nào cả, nhưng một thực thể
xuất hiện trong lớp con, thì chắc chắn phải một thành viên của lớp cha.
VÍ DỤ 3.2: Mối liên kết cha/con trong mô hình thực thể kết hợp mở rộng.
Chúng ta có một kỹ sư nhưng đang làm công tác văn phòng. Do đó, nhân viên này
là một thực thể của EMPLOYEE, và đồng thời cũng thuộc cả SECRETARY lẫn
ENGINEER. Ngược lại, nếu một người được xem là nhân viên lái xe trong công
ty (thuộc DRIVER) thì chắc chắn anh ta phải là nhân viên của công ty (tức là một
thành viên của EMPLOYEE).
Một khái niệm quan trọng khác có liên quan tới mối liên kết cha/con đó là sự kế
thừa. Chúng ta đã biết một tập thực thể được xác định bởi các thuộc tính và các
mối liên kết mà nó tham gia trong đó. Bởi vì mỗi thực thể trong lớp con biểu diễn
cùng một sự việc trong thế giới thực với một thực thể nào đó của lớp cha, cho nên
chúng sẽ có cùng giá trị tại các thuộc tính của mình. Chúng ta nói rằng, các thực
thể trong lớp con kế thừa tất cả các thuộc tính của lớp cha và các kiểu liên kết mà
lớp cha tham gia trong đó. Ngoài các thuộc tính và các kiểu liên kết được kế thừa
từ lớp cha, bản thân lớp con cũng có các thuộc tính và các kiểu liên kết riêng mà
lớp cha không có. Như vậy, lớp con với các thuộc tính và các kiểu liên kết mà nó
tham gia trong đó cũng có thể được xem là một tập thực thể.
Email: namth@buh.edu.vn 54
VÍ DỤ 3.3: Các lớp con có thể có thuộc tính riêng.
Các lớp con trong mối liên kết cha/con với lớp cha EMPLOYEE có thể có các
thuộc tính và các kiểu liên kết riêng. Chẳng hạn như, lớp con SECRETARY có
thuộc tính riêng là TypingSpeed (tốc độ đánh máy), lớp con ENGINEER có thuộc
tính riêng là EngType (lĩnh vực chuyên môn), hoặc lớp DRIVER cũng có thuộc
tính riêng là Vehicle (loại xe). Các thuộc tính này được thể hiện trong hình sau
đây.
Hình 3.2. Bên cạnh các thuộc tính được kế thừa từ lớp cha,
lớp con còn có thể có các thuộc tính riêng
3.2.2 Chuyên biệt hóa
Với định nghĩa về mối liên kết cha/con như ở trên, chúng ta có thể dễ dàng nhận
thấy có hai quá trình liên quan đến mối liên kết này: quá trình chuyên biệt hóa và
quá trình khái quát hóa.
Chuyên biệt hóa là quá trình xác định một tập các lớp con của một tập thực thể.
Tập thực thể đang xét được gọi là lớp cha của quá trình này. Tập các lớp con được
hình thành trong quá trình chuyên biệt hóa được định nghĩa dựa trên một số đặc
điểm phân biệt giữa thực thể này với thực thể khác trong lớp cha.
Email: namth@buh.edu.vn 55
VÍ DỤ 3.4: Chuyên biệt hóa dựa trên thuộc tính.
Quá trình chuyên biệt hóa lớp cha EMPLOYEE thành nhiều lớp con
ENGINEER, SECRETARY, DRIVER dựa vào đặc thù của công việc được
giao. Chúng ta đặt tên cho thuộc tính này JobType. Một sự chuyên biệt hóa khác
có thể thực hiện trên lớp cha EMPLOYEE thành nhiều lớp con FULLTIME
(làm việc toàn thời gian), EXPERIENCED (có kinh nghiệm), và
QUALIFICATION (có bằng cấp). Hình sau đây minh họa chi tiết hai phép
chuyên biệt hóa của tập thực thể EMPLOYEE.
Hình 3.3. Chuyên biệt hóa lớp cha thành nhiều lớn con
Bây giờ chúng ta hãy xét một mối liên kết cha/con giữa hai tập thực thể P (viết tắt
của Parent, tức là cha) và C (viết tắt của Children, tức là con). Rõ ràng, với mỗi
thực thể xuất hiện trong C, thì phải có một thực thể tương ứng trong P, sao cho
chúng cùng phản ánh một sự vật trong thế giới thực. Ngược lại, cứ mỗi thực thể
trong P, chúng ta hoặc tìm thấy một, hoặc không tìm thấy thực thể nào trong C để
chúng cùng phản ánh một sự vật trong thế giới thực. Rõ ràng, đây có thể xem như
là một kiểu liên kết hai ngôi một – một giữa hai tập thực thể P và C. Có điều khác
biệt duy nhất, với kiểu liên kết hai ngôi một – một trong mô hình thực thể kết hợp
được trình bày ở chương trước, hai thực thể tham gia trong liên kết về cơ bản là
hai thực thể khác nhau, phản ánh hai sự vật khác nhau trong thế giới thực, còn
trong kiểu liên kết cha/con, hai thực thể tham gia cùng phản ánh một sự vật trong
thế giới thực.
Email: namth@buh.edu.vn 56
Cùng với sự tương đồng nói trên, hai nguyên nhân sau đây lý giải tại sao người ta
lại đưa khái niệm về mối liên kết cha/con và các quá trình chuyên biệt hóa/khái
quát hóa vào trong mô hình dữ liệu:
Lớp con có thể có các thuộc tính riêng mà lớp cha không có. Khi đó lớp
con sẽ được tạo ra để nhóm các thực thể có chung những thuộc tính này lại
với nhau. Thành viên của lớp con này vẫn tiếp tục chia sẻ với các thành
viên của lớp con khác những thuộc tính của lớp cha.
Lớp con có thể có các kiểu liên kết riêng mà lớp cha không có. Thành viên
của lớp con vẫn kế thừa các kiểu liên kết có liên quan tới lớp cha.
Như vậy, quá trình chuyên biệt hóa cần trải qua các giai đoạn sau đây:
1) Định nghĩa một tập các lớp con của một tập thực thể.
2) Xác định các thuộc tính riêng của lớp con.
3) Xác định các kiểu liên kết riêng của lớp con với các tập thực thể khác hoặc
với các lớp con khác.
VÍ DỤ 3.5: Khái quát hóa dựa trên các thuộc tính dùng chung.
Quá trình khái quát hóa các tập thực thể ENGINEER, SECRETARY, DRIVER
để phát hiện những thuộc tính chung của chúng. Các thuộc tính chung này lần lượt
là ESSN, EName, ESex, ESalary, EBirthdate, và EStartdate. Để không lặp lại các
thuộc này tính, chúng ta tạo một tập thực thể có tên gọi là EMPLOYEE với các
Email: namth@buh.edu.vn 57
thuộc tính nêu trên. Các tập thực thể ban đầu sẽ có mối liên kết cha/con với
EMPLOYEE để kế thừa các thuộc tính của nó.
3.2.4 Ràng buộc trong chuyên biệt hóa và khái quát hóa
Nhìn chung, chúng ta có thể áp dụng nhiều phép chuyên biệt hóa khác nhau lên
cùng một tập thực thể. Ví dụ 3.3 trên đây minh họa cho hai phép chuyên biệt hóa
lên cùng tập thể EMPLOYEE.
Với định nghĩa về chuyên biệt hóa, chúng ta thấy rằng một thực thể bất kỳ trong
lớp cha có thể thuộc về nhiều lớp con khác nhau trong mỗi phép chuyên biệt hóa.
Số lượng các lớp con được tạo ra phụ thuộc vào đặc điểm của phép chuyên biệt
hóa được áp dụng. Số lớp con do một phép chuyên biệt hóa tạo ra có thể là một
hay nhiều hơn một. Đồng thời, để có thể xác định chính xác một thực thể nằm
trong một lớp con nào đó, chúng ta có thể sử dụng một điều kiện phân nhóm dựa
trên giá trị của một số thuộc tính trong lớp cha. Các lớp con được xác định như thế
này được gọi là lớp con định nghĩa trước. Nếu tất cả các lớp con đều có điều kiện
phân nhóm trên cùng một thuộc tính, thì phép chuyên biệt hóa được gọi là được
định nghĩa theo thuộc tính, và thuộc tính đó có tên gọi là thuộc tính phân nhóm. Ví
dụ sau đây là một phép chuyên biệt hóa theo thuộc tính.
Email: namth@buh.edu.vn 58
Hình 3.4. Chuyên biệt hóa lớp EMPLOYEE theo thuộc tính JobType.
Khi không có điều kiện phân nhóm, lớp con là do người dùng tự định nghĩa.
Người dùng xác định các thành viên của lớp con bằng cách thêm lần lượt từng
thực thể của lớp cha vào một hoặc một số lớp con nào đó. Quá trình này diễn ra
cho đến khi các lớp con được xây dựng xong mới thôi.
Quan sát ví dụ 3.6, chúng ta có thể nhận thấy rằng, một thực thể trong lớp cha
EMPLOYEE không thể xuất hiện trong nhiều hơn một lớp con. Điều này có
nghĩa là, trong phép chuyên biệt hóa dựa trên một thuộc tính đơn trị, các lớp con
luôn không trùng lắp, hay luôn không có phần tử chung. Người ta đặt tên cho loại
ràng buộc này là ràng buộc không trùng lắp (ký hiệu là d, viết tắt của disjoint)
trong phép chuyên biệt hóa. Trong trường hợp phép chuyên biệt hóa không duy trì
ràng buộc không trùng lắp, một thực thể trong lớp cha có thể xuất hiện trong nhiều
lớp con. Nói cách khác, các lớp con có thể trùng lắp. Chúng ta ký hiệu phép
chuyên biệt hóa được phép trùng lắp là o (viết tắt của overlap).
Loại ràng buộc cuối cùng được định nghĩa trong phép chuyên biệt hóa, đó là ràng
buộc đầy đủ. Ràng buộc này giúp chúng ta phân biệt phép chuyên biệt hóa là toàn
phần hay một phần. Ràng buộc toàn phần phát biểu rằng mọi thực thể của lớp cha
phải là thành viên của ít nhất một lớp con. Trong khi đó, ràng buộc từng phần lại
cho biết một thực thể của lớp cha có thể không nằm trong bất kỳ lớp con nào cả.
Email: namth@buh.edu.vn 59
Ví dụ 3.7 giúp chúng ta thể hiện đồng thời hai loại ràng buộc này trên mô hình
thực thể kết hợp.
Hình 3.5. Ràng buộc trong chuyên biệt hóa và khái quát hóa
Một điểm cần lưu ý là ràng buộc không trùng lắp và ràng buộc đầy đủ là hai ràng
buộc hoàn toàn độc lập. Vì vậy, mỗi phép chuyên biệt hóa sẽ thuộc một trong bốn
trường hợp sau đây:
Ràng buộc không trùng lắp và toàn phần
Ràng buộc không trùng lắp và từng phần
Ràng buộc có thể trùng lắp và toàn phần
Ràng buộc có thể trùng lắp và từng phần
Từ các ràng buộc nêu trên, chúng ta có thể suy ra một số quy tắc áp dụng cho
trường hợp thêm và loại bỏ thực thể ra khỏi lớp cha, lớp con:
Xóa một thực thể ở lớp cha dẫn tới việc thực thể này sẽ tự động bị xóa ra
khỏi tất cả các lớp con (mà nó là thành viên).
Email: namth@buh.edu.vn 60
Thêm một thực thể vào lớp cha dẫn tới việc thực thể này sẽ tự động được
thêm vào các lớp con mà nó thỏa mãn điều kiện thành viên (đối với phép
chuyên biệt hóa theo thuộc tính).
Thêm một thực thể vào lớp cha trong phép chuyên biệt hóa toàn phần dẫn
đến việc thực thể này sẽ tự động được thêm vào ít nhất một lớp con trong
phép chuyên biệt hóa đang xét.
Một cách tương tự, vì mối liên kết cha/con trong mỗi phép chuyên biệt hóa là một
dạng liên kết cha/con trong phép kế thừa, cho nên chúng ta cũng có thể dùng cây
phân cấp hay lưới phân cấp để thể hiện mối liên kết cha/con trong các phép
chuyên biệt hóa trên cùng một tập các thực thể khác nhau. Sự phân cấp thể hiện
trong trường hợp này có ý nghĩa như sau: một lớp con trong phép chuyên biệt hóa
này có thể là lớp cha của phép chuyên biệt hóa khác. Ví dụ 3.8 minh họa lưới phân
cấp đối với tập thực thể EMPLOYEE.
Email: namth@buh.edu.vn 61
Hình 3.6. Lưới phân cấp đối với tập thực thể EMPLOYEE
Để biểu diễn sự kế thừa bằng cây phân cấp hay lưới phân cấp, chúng ta cần chú ý
các đặc điểm sau đây. Các đặc điểm này được áp dụng với cả chuyên biệt hóa lẫn
khái quát hóa.
Trong cây hay lưới phân cấp, lớp con không chỉ thừa kế tất cả các thuộc
tính của lớp cha trực tiếp của nó mà còn thừa kế tất cả lớp cha khác cao hơn
(duyệt theo nhánh từ nó lên đến gốc).
Một thực thể có thể là thành viên của nhiều nút lá trong cây phân cấp. Ở
đây chúng ta định nghĩa nút lá là lớp không có lớp con.
Một lớp con có nhiều hơn một lớp cha được gọi là nút con chung. Khi đó,
lớp con chung sẽ thừa kế tất cả thuộc tính từ các lớp cha của nó.
Xét trường hợp lớp con chung được kế thừa từ nhiều lớp cha, các lớp cha
này lại là lớp con của một lớp cha khác. Các thuộc tính của lớp cha khác
này chỉ được xuất hiện duy nhất một lần trong lớp con chung.
Email: namth@buh.edu.vn 62
3.3 MỘT ỨNG DỤNG CỦA MÔ HÌNH THỰC THỂ
KẾT HỢP MỞ RỘNG
Để minh họa việc ứng dụng mô hình thực thể kết hợp mở rộng để giải quyết bài
toán thực tế, chúng ta tiếp tục ví dụ mẫu được trình bày ở mục 2.2 với một số bổ
sung như sau:
Các nhân viên trong công ty được chia làm ba nhóm phân biệt, dựa trên đặc
điểm công việc mà họ thực hiện tại công ty: kỹ sư, thư ký, và nhân viên
phục vụ.
Công ty áp dụng một số chỉ tiêu để đánh giá nhân viên: thời gian làm việc,
kinh nghiệm thực tế, và bằng cấp chuyên môn.
Công ty thực hiện chế độ bảo hiểm y tế đối với người thân của các kỹ sư
làm việc toàn thời gian tại công ty.
Với những sự bổ sung nói trên, chúng ta có thể cải tiến lại mô hình được trình bày
trong hình 2.4 thành mô hình thực thể kết hợp mở rộng sau đây:
Hình 3.6. Mô hình thực thể kết hợp mở rộng của cơ sở dữ liệu COMPANY
Email: namth@buh.edu.vn 63
3.4 CÁC CÔNG CỤ THIẾT KẾ MÔ HÌNH CƠ SỞ
DỮ LIỆU
Thiết kế mô hình cơ sở dữ liệu giữ vai trò quan trọng trong việc quản lý và khai
thác dữ liệu sau khi cơ sở dữ liệu đã được triển khai. Nhằm hỗ trợ người sử dụng
trong việc thiết kế cơ sở dữ liệu, đặc biệt là ở mức độ ý niệm như mô hình thực thể
kết hợp (mở rộng), một số công ty phần mềm đã được ra các sản phẩm thương mại
lẫn phi thương mại. Một số sản phẩm tiêu biểu trong lĩnh vực này: StarUML, Jude,
Rational Rose, Altova, Visio, … Các sản phẩm này có một đặc điểm chung là
được xây dựng trên ngôn ngữ mô hình hóa hợp nhất (Unified Modelling
Languages, viết tắt là UML). Trong phạm vi giáo trình, chúng ta không nghiên
cứu chi tiết về UML và các ứng dụng của nó trong lĩnh vực công nghệ phần mềm.
Chúng ta chỉ giới hạn nội dung trình bày ở việc ứng dụng UML để mô hình hóa
kiến trúc của cơ sở dữ liệu.
Thành phần cơ bản của UML là lớp với các khai báo về các trạng thái và hành vi
mà đối tượng của lớp đó được phép thực hiện. Chính vì lý do này mà UML được
sử dụng làm ngôn ngữ chính trong các hoạt động phân tích và thiết kế các hệ
thống thông tin hướng đối tượng. Lớp trong UML tương ứng với tập thực thể
trong mô hình thực thể kết hợp. Các thuộc tính của tập thực thể được xem như là
thuộc tính của lớp tương ứng trong UML.
Liên kết trong UML được xác định giữa hai lớp, tương ứng với một kiểu liên kết
hai ngôi giữa hai tập thực thể trong mô hình thực thể kết hợp. Đặc biệt, UML
không cho phép liên kết nhiều ngôi. Đó cũng chính là lý do tại sao trong chương 2,
chúng ta đã tìm cách phân tách kiểu liên kết nhiều ngôi thành nhiều kiểu liên kết
hai ngôi.
Email: namth@buh.edu.vn 64
Hình 3.7. Lược đồ UML ứng với mô hình thực thể kết hợp của
cơ sở dữ liệu COMPANY được trình bày trong hình 2.4
Cuối cùng, UML hỗ trợ cấu trúc phân cấp bằng các mối liên kết cha/con tương tự
như đối với sự chuyên biệt hóa và khái quát trong mô hình thực thể kết hợp mở
rộng.
Hình 3.8. Lược đồ UML ứng với cây phân cấp được trình bày trong ví dụ 3.8
Email: namth@buh.edu.vn 65
3.5 TÓM TẮT
Để có được một bản thiết kế cơ sở dữ liệu tốt, phản ánh đúng thế giới thực mà nó
cần thể hiện, nhân viên thiết kế cần phải được cung cấp một phương pháp luận
đúng đắn. Trong nhiều trường hợp mô hình thực thể kết hợp là một phương pháp
luận như thế. Tuy nhiên, với tính phức tạp ngày càng cao của các hệ thống thông
tin, có một số yêu cầu về cấu trúc dữ liệu mà mô hình này không thể đáp ứng
được.
Mô hình thực thể kết hợp mở rộng theo đúng tên gọi của nó là một sự mở rộng của
mô hình thực thể kết hợp với các khái niệm về chuyên biệt hóa, khái quát hóa, hai
thể hiện chính của sự kế thừa trong hướng đối tượng của một hệ thống thông tin.
Chuyên biệt hóa được xem như là quá trình phân tách các lớp con từ một lớp cha.
Việc phân tách có thể dựa trên giá trị của một (số) thuộc tính phân nhóm, hoặc do
người dùng tự định nghĩa. Một số ràng buộc khác liên quan đến quá trình chuyên
biệt hóa bao gồm: ràng buộc không trùng lắp và ràng buộc đầy đủ (ràng buộc toàn
phần). Ràng buộc không trùng lắp nói rằng một thực thể thuộc lớp cha chỉ có thể
thuộc nhiều nhất một lớp con của phép chuyên biệt hóa. Trong khi đó, ràng buộc
toàn phần đảm bảo mọi thực thể thuộc lớp cha phải thuộc ít nhất một lớp con của
phép chuyên biệt hóa.
Trên thị trường hiện nay có rất nhiều sản phẩm mô hình hóa cơ sở dữ liệu, đa số
các sản phẩm này đều được xây dựng trên ngôn ngữ mô hình hóa hợp nhất UML.
Do đó, trong phần cuối chương này, chúng tôi giới thiệu một phép biến đổi đơn
giản từ mô hình thực thể kết hợp (mở rộng) sang ngôn ngữ UML. Để tìm hiểu chi
tiết hơn về UML, đọc giả có thể xem thêm các tài liệu tham khảo ở cuối giáo trình
này.
Email: namth@buh.edu.vn 66
C
CHHƯ
ƯƠƠN
NGG
4
MÔ HÌNH DỮ LIỆU QUAN HỆ
Mục tiêu
Chương này tập trung nghiên cứu mô hình dữ liệu quan hệ ở ba khía cạnh: tổ chức
dữ liệu quan hệ, các thao tác trên dữ liệu quan hệ, và ràng buộc toàn vẹn trên dữ
liệu quan hệ. Từ đó, người đọc được trang bị các kiến thức nền tảng về mô hình dữ
liệu được sử dụng phổ biến nhất hiện nay.
Nội dung
Các khái niệm cơ bản.
Ràng buộc toàn vẹn trên mô hình dữ liệu quan hệ.
Các toán tử cập nhật trên quan hệ.
Email: namth@buh.edu.vn 71
Giới thiệu
Lịch sử hình thành và phát triển của các hệ cơ sở dữ liệu đã bước sang trang mới
kể từ khi Ted Codd công bố công trình nghiên cứu của mình vào năm 1970. Theo
Codd, để phát huy tối đa khả năng sáng tạo của người sử dụng, các hệ cơ sở dữ
liệu nên cung cấp cho họ một cái nhìn đơn giản, dễ hiểu về dữ liệu mà họ có nhu
cầu. Codd đề xuất sử dụng bảng dữ liệu hai chiều – với tên gọi là quan hệ – để mô
tả dữ liệu trong các hệ cơ sở dữ liệu. Việc mô tả này sẽ làm cho hệ cơ sở dữ liệu
trở nên phức tạp hơn, thậm chí, bản thân các yêu cầu xử lý dữ liệu cũng trở nên rắc
rối hơn. Tuy nhiên, đối với người sử dụng, họ không cần quan tâm tới việc dữ liệu
được lưu trữ như thế nào trong bộ nhớ, họ cũng không cần biết yêu cầu của họ
được thực thi ra sao; họ chỉ quan tâm tới việc làm sao xây dựng được các câu truy
vấn, và chúng cho ra kết quả đúng như họ mong muốn mà thôi. Do vậy, với đề
xuất của Codd, các câu truy vấn trở nên rất đơn giản, có thể được biểu diễn ở mức
trừu tượng cao, và gần gũi với người sử dụng. Trên nền tảng ứng dụng quan hệ
trong việc xây dựng hệ cơ sở dữ liệu, ngôn ngữ mô tả truy vấn mới được ra đời, đó
chính là ngôn ngữ truy vấn có cấu trúc SQL.
Các sản phẩm thương mại đầu tiên của mô hình dữ liệu quan hệ được công bố đầu
những năm 1980, với hai sản phẩm tiêu biểu là Oracle DBMS và hệ thống
SQL/DS trên hệ điều hành MVS của IBM. Từ đó đến nay, trên thị trường xuất
hiện nhiều hệ quản trị cơ sở dữ liệu có tên tuổi ứng dụng mô hình dữ liệu này, tiêu
biểu như là DB2 và Informix Dynamic Server (của IBM), Oracle và RBD (của
Oracle), SQLServer và Access (của Microsoft), …
Đã gần nửa thế kỷ từ khi khái niệm mô hình dữ liệu quan hệ ra đời, mô hình này
vẫn giữ vai trò chủ đạo, vẫn là nền tảng cho hầu hết các hệ cơ sở dữ liệu đang tồn
tại trên thị trường. Chính vì vậy, mô hình dữ liệu quan hệ là nội dung bắt buộc đối
với mọi sinh viên theo học các chương trình đào tạo về công nghệ thông tin, và hệ
thống thông tin.
Email: namth@buh.edu.vn 72
4.1 CÁC KHÁI NIỆM CƠ BẢN
Mô hình quan hệ biểu diễn cơ sở dữ liệu như là tập hợp các quan hệ, mỗi quan hệ
có thể được coi là một bảng dữ liệu hai chiều gồm nhiều cột và nhiều hàng. Mỗi
hàng trong bảng (trừ hàng tiêu đề) biểu diễn một sự vật tương ứng với một thực
thể hoặc một liên kết trong thế giới thực. Tên bảng và tên các cột (tức hàng tiêu
đề) được dùng để diễn giải ý nghĩa của các giá trị tại mỗi hàng. Tất cả giá trị trong
cùng một cột (ngoại trừ tiêu đề cột) có cùng kiểu dữ liệu. Để bắt đầu với mô hình
dữ liệu quan hệ, chúng ta lần lượt tìm hiểu các khái niệm cơ bản của mô hình này.
Mỗi thuộc tính là một tính chất riêng biệt của đối tượng cần được lưu trữ trong cơ
sở dữ liệu. Các thuộc tính được xác định bởi một tên gọi, kiểu giá trị và miền giá
trị của chúng. Mỗi thuộc tính đều phải thuộc một kiểu dữ liệu cơ bản nào đó. Kiểu
dữ liệu có thể là vô hướng (String, Text, Character, Number, Logical, …) hoặc các
kiểu dữ liệu có cấu trúc được định nghĩa dựa trên các kiểu dữ liệu đã có sẵn. Mỗi
Email: namth@buh.edu.vn 73
thuộc tính chỉ có thể nhận những giá trị trong một tập con của kiểu dữ liệu. Tập
hợp các giá trị mà thuộc tính A có thể nhận được gọi là miền giá trị của thuộc tính
A, và được ký hiệu là dom(A).
Các hàng trong quan hệ, ngoại trừ hàng tiêu đề chứa tên các thuộc tính, được gọi
là các bộ của quan hệ. Mỗi thành phần trong bộ chứa giá trị tương ứng với từng
thuộc tính của quan hệ.
Thể hiện quan hệ tại một thời điểm bao gồm một số hữu hạn các bộ biểu diễn
trạng thái cụ thể của thế giới thực, và khi trạng thái của thế giới thực thay đổi, thể
hiện quan hệ cũng thay đổi theo, và trở thành một thể hiện quan hệ mới. Nói cách
khác, thể hiện của quan hệ luôn luôn biến đổi. Trong khi đó, lược đồ quan hệ R rất
ít khi bị thay đổi, ngoại trừ những trường hợp đặc biệt – ví dụ như khi chúng ta
cần thêm thuộc tính mới để thể hiện một thông tin mới chưa có trong quan hệ.
Việc thay đổi lược đồ quan hệ có thể phát sinh nhiều vấn đề, bởi vì chúng ta cần
phải thay đổi tất cả các bộ hiện có trong quan hệ.
Email: namth@buh.edu.vn 74
quan hệ như là bảng, với mỗi bộ được biểu diễn như là một hàng, và mỗi thuộc
tính tương ứng với tiêu đề cột.
Trong mô hình quan hệ, cơ sở dữ liệu bao gồm nhiều quan hệ. Tập hợp các lược
đồ quan hệ của cơ sở dữ liệu được gọi là lược đồ cơ sở dữ liệu, hay ngắn gọn là
lược đồ cơ sở dữ liệu.
Hình 4.2 minh hoạ lược đồ cơ sở dữ liệu COMPANY với các lược đồ quan hệ
được mô tả chi tiết như sau:
DEPARTMENT
Quan hệ này lưu trữ thông tin về phòng ban trong công ty bao gồm mã số phòng
ban, tên phòng ban, mã số trưởng phòng ban và thời điểm được bổ nhiệm.
EMPLOYEE
Quan hệ lưu trữ thông tin về nhân viên trong công ty bao gồm mã số nhân viên, họ
tên, mức lương, giới tính. Mỗi nhân viên thuộc biên chế của một phòng ban, và
chịu sự giám sát chéo của một nhân viên khác.
DEPENDENT
Quan hệ lưu trữ thông tin về thân nhân của nhân viên trong công ty, bao gồm tên
thân nhân, mã số nhân viên tương ứng, giới tính, ngày sinh, và mối quan hệ gia
đình với nhân viên.
PROJECT
Email: namth@buh.edu.vn 75
Quan hệ lưu trữ thông tin về dự án của công ty, bao gồm mã số dự án, tên dự án,
mã số địa điểm triển khai dự án, mã số phòng ban chịu trách nhiệm quản lý dự án.
DEPLOCATION
Quan hệ lưu trữ thông tin về địa điểm mà công ty có văn phòng đại diện, bao gồm
tên địa điểm, mã số phòng ban có văn phòng tại địa điểm này.
WORKSON
Quan hệ lưu trữ thông tin về thời gian làm việc của nhân viên trong từng dự án,
cho biết nhân viên này tham gia dự án nào với số giờ làm việc trong tuần là bao
nhiêu.
DEPENDENT
DName
ESSN
DSex
DBirthdate
DRelationship
Quan hệ được định nghĩa như là tập hợp gồm nhiều bộ. Do đó, giữa các bộ trong
một quan hệ không có bất kỳ thứ tự sắp xếp nào. Điều này có nghĩa là khi thay đổi
Email: namth@buh.edu.vn 76
trật tự hiển thị của các bộ trong quan hệ, chúng ta nhận được một biểu diễn tương
đương với biểu diễn ban đầu của quan hệ.
VÍ DỤ 4.4: Hai thể hiện tương đương của một quan hệ.
Hình sau đây minh hoạ hai thể hiện của quan hệ EMPLOYEE. Hai thể hiện này
được coi là tương đương với nhau vì các bộ dữ liệu của chúng giống hệt nhau, chỉ
khác thứ tự xuất hiện mà thôi.
Theo định nghĩa về bộ trong quan hệ R có n thuộc tính, một bộ t của quan hệ R
phải có n–thành phần. Đây là danh sách có thứ tự của n giá trị. Điều này có nghĩa
là các giá trị trong một bộ – hay các thuộc tính trong một quan hệ – phải tuân theo
một trật tự nhất định. Do đó, nếu chúng ta thay đổi trật tự hiển thị các thuộc tính
trong quan hệ, chúng ta phải thay đổi trật tự hiển thị của các cột chứa dữ liệu ứng
với các thuộc tính đó. Trong trường hợp này, chúng ta cũng sẽ nhận được một biểu
diễn mới tương đương với biểu diễn ban đầu của quan hệ.
VÍ DỤ 4.5: Hai thể hiện tương đương của một quan hệ.
Hình sau đây minh họa hai thể hiện của quan hệ EMPLOYEE. Hai thể hiện này
được coi là tương đương với nhau vì các bộ dữ liệu của chúng giống hệt nhau, chỉ
khác thứ tự xuất hiện của các thuộc tính mà thôi.
Email: namth@buh.edu.vn 77
Hình 4.4. Hai thể hiện của quan hệ EMPLOYEE
4.1.2.3 Các giá trị thuộc tính trong bộ
Mọi giá trị trong bộ đều phải là giá trị đơn, nghĩa là các giá trị này không thể phân
chia thành các thành phần nhỏ hơn mà vẫn đáp ứng được các nguyên tắc cơ bản
của mô hình quan hệ.
Khi biểu diễn các giá trị không biết, hoặc không được áp dụng trong bộ, chúng ta
sử dụng một giá trị đặc biệt, đó là giá trị null. Chúng ta có nhiều diễn giải cho các
giá trị null, ví dụ như là giá trị không biết, giá trị tồn tại nhưng không xác định,
hoặc là thuộc tính không áp dụng cho bộ này.
Email: namth@buh.edu.vn 78
4.1.2.4 Quan hệ
Lược đồ quan hệ có thể được hiểu như là một khai báo của quan hệ. Một số quan
hệ được dùng để biểu diễn các định nghĩa về thực thể, một số khác lại định nghĩa
mối liên kết giữa các thực thể. Trong thực tế, người ta không phân biệt hai loại
quan hệ này, và cả hai được gọi chung bằng một cái tên: quan hệ.
Email: namth@buh.edu.vn 79
Các ký tự t,u,v biểu diễn bộ trong quan hệ.
Email: namth@buh.edu.vn 80
Rõ ràng mọi quan hệ đều có ít nhất một siêu khóa – đó là tập hợp tất cả các thuộc
tính của quan hệ đó. Siêu khóa có thể có thuộc tính thừa, tức là nếu bỏ các thuộc
tính đó đi, tập hợp các thuộc tính còn lại vẫn thỏa mãn tính chất của một siêu
khóa. Từ đó chúng ta đưa ra khái niệm về khóa – siêu khóa không có thuộc tính dư
thừa.
Như vậy, nếu gọi tập hợp con các thuộc tính K là một khoá của quan hệ R, K cần
phải thoả mãn đồng thời hai điều kiện sau đây:
1) K là siêu khóa;
2) K là siêu khóa nhỏ nhất, tức là mọi tập con thực sự của K đều không thể là
siêu khóa.
Dễ dàng nhận thấy rằng, nếu siêu khoá gồm duy nhất một thuộc tính thì siêu khoá
đó đồng thời là khoá. Giá trị của thuộc tính khóa được dùng để xác định từng bộ
duy nhất trong quan hệ. Chính vì vậy khóa là đặc trưng của lược đồ quan hệ, nó là
ràng buộc được áp dụng cho mọi thể hiện của lược đồ quan hệ. Khóa được xác
định từ ý nghĩa của các thuộc tính và có tính bất biến theo thời gian: nó tiếp tục
được duy trì khi chúng ta thêm mới các bộ dữ liệu vào trong quan hệ.
Email: namth@buh.edu.vn 81
Thông thường, một lược đồ quan hệ có thể có nhiều hơn một khóa. Trong trường
hợp này, chúng ta chọn một khoá làm khoá chính, các khóa còn lại được gọi là
khóa phụ.
Email: namth@buh.edu.vn 82
trị cùng là NULL tại thuộc tính ESSN. Trong trường hợp này, ESSN không thể
được dùng để phân biệt các bộ trong quan hệ EMPLOYEE. Điều này mâu thuẫn
với chính khái niệm khoá chính được dùng để phân biệt các bộ khác nhau trong
quan hệ.
4.2.5 Ràng buộc toàn vẹn tham chiếu
Trong khi ràng buộc khóa và ràng buộc toàn vẹn thực thể được định nghĩa trên
từng quan hệ riêng lẻ, ràng buộc toàn vẹn tham chiếu được xác định giữa hai quan
hệ với ý nghĩa một giá trị muốn xuất hiện trong quan hệ này phải xuất hiện trong
một quan hệ khác có liên quan. Ràng buộc toàn vẹn tham chiếu hiểu một cách đơn
giản là nếu một bộ của quan hệ R muốn tham chiếu tới quan hệ S, thì phải tham
chiếu tới một bộ hiện có sẵn của quan hệ S. Lúc bấy giờ, R là quan hệ tham chiếu,
còn S là quan hệ được tham chiếu. Để tồn tại một ràng buộc toàn vẹn tham chiếu
từ tập thuộc tính A của R tới tập thuộc tính B của S, các điều kiện sau đây phải
thoả mãn:
1) Các thuộc tính trong A có cùng miền giá trị với các thuộc tính trong B
tương ứng
2) Các thuộc tính trong B phải là khoá chính hoặc khoá phụ của S
3) Giá trị tại A của một bộ trong R hoặc là null, hoặc là giá trị tại B của
một bộ nào đó trong S
Để xác định được ràng buộc toàn vẹn tham chiếu đầu tiên chúng ta phải hiểu rõ ý
nghĩa và vai trò của mỗi (tập) thuộc tính trong từng lược đồ quan hệ của cơ sở dữ
liệu. Ràng buộc toàn vẹn tham chiếu xuất phát từ mối liên hệ giữa các tập thực thể
thế giới thực được biểu diễn bởi cơ sở dữ liệu.
Email: namth@buh.edu.vn 83
Mỗi dự án ngoài mã số, tên, còn có thông tin cho biết địa điểm thực hiện dự án
(PLocation), và mã số của đơn vị quản lý dự án (DNum). Đơn vị quản lý dự án
phải là một đơn vị của công ty, có nghĩa là phải nằm trong quan hệ
DEPARTMENT. Do đó, thuộc tính DNum của quan hệ PROJECT tham chiếu
tới thuộc tính DNumber của quan hệ DEPARTMENT; tồn tại ràng buộc toàn vẹn
tham chiếu từ PROJECT tới DEPARTMENT.
4.2.6 Ràng buộc toàn vẹn ngữ nghĩa
Các ràng buộc chúng ta vừa kể trên không bao gồm một lớp các ràng buộc phổ
biến còn được gọi là ràng buộc toàn vẹn ngữ nghĩa. Đúng theo tên gọi của mình,
kiểu ràng buộc này đảm bảo thể hiện cơ sở dữ liệu tại mọi thời điểm phản ánh
đúng tình trạng thế giới thực. Phần lớn các ràng buộc kiểu này đều do chương
trình ứng dụng cơ sở dữ liệu thiết lập và quản lý. Ngoài ra, chúng ta cũng có thể
dùng cấu trúc TRIGGER hoặc ASSERTION trong SQL92 để định nghĩa một số
ràng buộc toàn vẹn ngữ nghĩa đơn giản.
Email: namth@buh.edu.vn 84
của quan hệ R có giá trị bằng nhau tại các thuộc tính X, thì cũng sẽ có giá trị bằng
nhau tại các thuộc tính Y, ký hiệu phụ thuộc hàm X → Y. Chúng ta sử dụng các
phụ thuộc hàm và các kiểu phụ thuộc khác trong chương 8, như là công cụ để đánh
giá hiệu quả thiết kế và để chuẩn hóa các quan hệ nhằm nâng cao chất lượng của
chúng.
Email: namth@buh.edu.vn 85
4) Ràng buộc toàn vẹn tham chiếu bị vi phạm nếu quan hệ R không bộ nào có
giá trị khóa chính giống với giá trị khóa ngoại của bộ t mới.
VÍ DỤ 4.14: Ràng buộc toàn vẹn dữ liệu bị vi phạm khi thêm mới một thực
thể.
Xét cơ sở dữ liệu mẫu trong hình 4.2. Ràng buộc toàn vẹn dữ liệu có thể bị vi
phạm trong các trường hợp sau:
a) Ràng buộc toàn vẹn miền giá trị bị vi phạm nếu thêm bộ (10, N‘Hệ thống
thông tin quản lý rừng’, N‘Gia Lai’, N‘Phòng Phần mềm trong nước’) vào
quan hệ PROJECT – giá trị tại thuộc tính DNum không là số nguyên.
b) Ràng buộc toàn vẹn khoá bị vi phạm nếu thêm bộ (10, N‘Hệ thống thông
tin quản lý rừng’, N‘Gia Lai’, 2) vào quan hệ PROJECT – hiện có sẵn bộ
có giá trị tại thuộc tính khoá PNumber là 10
c) Ràng buộc toàn vẹn thực thể bị vi phạm nếu thêm bộ (null, ‘Hệ thống thông
tin quản lý rừng’, N‘Gia Lai’, 2) vào quan hệ PROJECT – giá trị tại thuộc
tính khoá không thể là NULL
d) Ràng buộc toàn vẹn tham chiếu bị vi phạm nếu thêm bộ (10, ‘Hệ thống
thông tin quản lý rừng’, N‘Gia Lai’, 8) vào quan hệ PROJECT – trong
DEPARTMENT không có bộ nào có giá trị tại thuộc tính DNumber là 8.
4.3.2 Toán tử Delete – xóa một (số) bộ ra khỏi quan hệ
Toán tử Delete được dùng để xoá một (số) bộ ra khỏi quan hệ R. Các bộ được xoá
nhất thiết phải thoả mãn điều kiện xoá được khai báo bên trong lệnh Delete. Trong
trường hợp điều kiện này không được khai báo tường minh, tất cả các bộ hiện có
trong quan hệ R đều bị xoá (bản thân lược đồ quan hệ R vẫn giữ nguyên). Toán tử
này chỉ có thể vi phạm ràng buộc toàn vẹn tham chiếu, nếu bộ đang xóa được tham
chiếu từ các bộ khác trong cơ sở dữ liệu thông qua các quan hệ khóa chính – khóa
ngoại.
Email: namth@buh.edu.vn 86
VÍ DỤ 4.15: Ràng buộc toàn vẹn dữ liệu bị vi phạm khi xoá một (số) bộ ra
khỏi quan hệ.
a) Ràng buộc toàn vẹn tham chiếu bị vi phạm, nếu xoá bộ có DNumber = 1
khỏi quan hệ DEPARTMENT – nhiều bộ trong quan hệ EMPLOYEE
đang tham chiếu tới bộ muốn xoá.
b) Ràng buộc toàn vẹn tham chiếu bị vi phạm , nếu xoá bộ có ESSN =
3010020004 khỏi quan hệ EMPLOYEE – nhiều bộ trong quan hệ
EMPLOYEE đang tham chiếu tới bộ muốn xoá.
4.3.3 Toán tử Update – cập nhật một (số) bộ trong quan hệ
Toán tử Update được sử dụng để thay đổi giá trị của một (số) thuộc tính trong một
(số) bộ của quan hệ R. Các bộ được cập nhật phải thoả mãn điều kiện cập nhật
được khai báo bên trong lệnh Update. Trong trường hợp điều kiện không được
khai báo tường minh, tất cả các bộ hiện có trong quan hệ R đều chịu ảnh hưởng
bởi thao tác này. Tương tự như toán tử Insert, toán tử này cũng có thể vi phạm cả
bốn loại ràng buộc đã nêu ở phần trước. Ví dụ 4.16 sau đây minh họa các trường
hợp ràng buộc toàn vẹn dữ liệu bị vi phạm khi toán tử Delete được thực thi.
VÍ DỤ 4.16: Ràng buộc toàn vẹn dữ liệu bị vi phạm khi sửa một (số) bộ có sẵn
trong quan hệ.
a) Ràng buộc toàn vẹn miền giá trị bị vi phạm, nếu thay đổi giá trị thuộc tính
ESex=‘U’ đối với bộ có ESSN=3010020004 trong quan hệ EMPLOYEE,
giá trị của thuộc tính ESex chỉ có thể là ‘F’, hoặc ‘M’.
b) Ràng buộc toàn vẹn khoá bị vi phạm, nếu thay đổi giá trị thuộc tính ESSN =
3010020004 đối với bộ có ESSN=3010020005 trong quan hệ EMPLOYEE
– trong quan hệ EMPLOYEE có sẵn một bộ khác có giá trị tại ESSN là
3010020004
Email: namth@buh.edu.vn 87
c) Ràng buộc toàn vẹn thực thể bị vi phạm, nếu đưa giá trị thuộc tính ESSN về
NULL đối với bộ có ESSN = 3010020004 trong quan hệ EMPLOYEE –
giá trị tại thuộc tính khoá không thể NULL.
d) Ràng buộc toàn vẹn tham chiếu bị vi phạm, nếu thay đổi giá trị thuộc tính
DNum = 7 đối với bộ có ESSN=3010020004 trong quan hệ EMPLOYEE –
trong DEPARMENT không tồn tại bộ có giá trị tại DNumber là 7
4.3.4 Xử lý vi phạm ràng buộc toàn vẹn tham chiếu
Hệ quản trị cơ sở dữ liệu có nhiệm vụ duy trì các ràng buộc toàn vẹn dữ liệu để
đảm bảo cơ sở dữ liệu luôn thoả mãn các ràng buộc này mọi lúc mọi nơi. Giải
pháp mặc định là từ chối thực hiện các phép toán dẫn tới vi phạm ràng buộc toàn
vẹn. Trong trường hợp này, hệ quản trị cơ sở dữ liệu sẽ đưa ra lời giải thích tại sao
phép toán không được thực hiện. Giải pháp này được áp dụng triệt để đối với các
loại ràng buộc toàn vẹn miền giá trị, ràng buộc toàn vẹn khoá, và ràng buộc toàn
vẹn thực thể. Riêng đối với loại ràng buộc toàn vẹn tham chiếu, hệ quản trị cơ sở
dữ liệu còn cho phép người sử dụng được quyền lựa chọn một trong ba cách xử lý
mỗi khi chúng bị vi phạm:
1) Cơ chế mặc định: hệ quản trị cơ sở dữ liệu từ chối tất cả những phép toán vi
phạm ràng buộc toàn vẹn tham chiếu.
2) Cơ chế thay thế: Những thay đổi tại giá trị thuộc tính khoá của bộ được
chiếu tới vi phạm ràng buộc toàn vẹn tham chiếu sẽ tự động được cập nhật
tại giá trị thuộc tính khoá ngoại của bộ chiếu đi tương ứng.
3) Cơ chế giá trị null: Nếu sự thay đổi tại giá trị thuộc tính khoá ngoại của bộ
chiếu đi vi phạm ràng buộc toàn vẹn tham chiếu, thì giá trị này được thiết
lập là NULL.
Email: namth@buh.edu.vn 88
4.4 TÓM TẮT
Trong chương này chúng ta đã tìm hiểu các khái niệm cơ bản về mô hình dữ liệu
quan hệ. Chúng ta bắt đầu với định nghĩa về lược đồ quan hệ, thuộc tính và miền
giá trị của thuộc tính. Chúng ta cũng đã phân biệt giữa thể hiện quan hệ và lược đồ
quan hệ. Cơ sở dữ liệu mẫu COMPANY cũng được mô tả chi tiết để người đọc có
thể dễ dàng tiếp cận nhằm phục vụ cho hệ thống các ví dụ xuyên suốt giáo trình
này.
Phần tiếp theo cũng chương này chúng ta tìm hiểu về các ràng buộc toàn vẹn trên
mô hình dữ liệu quan hệ. Các ràng buộc thực chất là các điều kiện đảm bảo dữ liệu
của chúng ta phù hợp với thực tế, phản án đúng thế giới thực mà nó lưu trữ. Chúng
ta nhấn mạnh ràng buộc khóa và ràng buộc toàn vẹn tham chiếu như là hai loại
ràng buộc phổ biến nhất trong mô hình dữ liệu quan hệ.
Tiếp theo, chúng tôi trình bày ba loại toán tử cập nhật trên quan hệ, bao gồm: thêm
mới, chỉnh sửa, và xóa bỏ một hoặc một số bộ cụ thể. Việc thêm, sửa và xóa dữ
liệu trong nhiều trường hợp sẽ dẫn đến vi phạm ràng buộc toàn vẹn dữ liệu. Cuối
cùng, chúng ta giới thiệu ba cơ chế có thể áp dụng trong trường hợp ràng buộc
toàn vẹn tham chiếu bị vi phạm: cơ chế mặc định, cơ chế thay thế, và cơ chế sử
dụng giá trị NULL.
Email: namth@buh.edu.vn 89
C
CHHƯ
ƯƠƠN
NGG
5
ĐẠI SỐ QUAN HỆ VÀ
PHÉP TÍNH QUAN HỆ
Mục tiêu
Chương này trang bị cho người đọc các kiến thức về đại số quan hệ – các phép
toán thực hiện trên quan hệ, nhằm giúp người đọc có thực hiện các câu lệnh truy
vấn từ đơn giản đến phức tạp trên mô hình dữ liệu quan hệ. Bên cạnh đó, người
đọc còn được làm quen với một hình thức thể biện khác của đại số quan hệ, đó là
phép tính quan hệ, nền tảng của ngôn ngữ dữ liệu phổ biến nhất hiện nay: ngôn
ngữ truy vấn có cấu trúc.
Nội dung
Các phép toán một ngôi.
Các phép toán hai ngôi.
Các phép toán khác.
Phép tính quan hệ trên bộ.
Phép tính quan hệ trên miền.
Email: namth@buh.edu.vn 94
Giới thiệu
Dữ liệu sau khi được định nghĩa, được sử dụng để lưu trữ thông tin. Ngày qua
ngày, thông tin được cập nhật liên tục, dữ liệu ngày càng trở nên phong phú, đồ sộ.
Tuy nhiên, dữ liệu đó sẽ chẳng có ý nghĩa gì, nếu người sử dụng không thể khai
thác được thông tin hữu ích từ chính nó. Vấn đề đặt ra ở đây là làm thế nào để
người sử dụng có thể đọc được thông tin lưu trữ trong cơ sở dữ liệu. Để làm được
điều đó, chúng ta cần xây dựng một tập hợp các phép toán được thực thi trên dữ
liệu có sẵn. Đối với mô hình dữ liệu quan hệ, tập hợp các phép toán này được gọi
là đại số quan hệ.
Các phép toán trong đại số quan hệ cho phép người sử dụng xây dựng quan hệ mới
từ một hoặc nhiều quan hệ có sẵn bằng cách thực hiện các yêu cầu truy vấn. Nhiều
phép toán quan hệ được thực hiện liên tiếp nhau, đầu ra của phép toán này là đầu
vào của phép toán kia, được gọi là biểu thức đại số quan hệ. Kết quả của một biểu
thức đại số quan hệ là một quan hệ mới – cũng chính là kết quả của phép toán
được thực hiện sau cùng.
Đại số quan hệ được coi như là nền tảng lý thuyết để xây dựng ngôn ngữ truy vấn
có cáu trúc SQL – ngôn ngữ sử dụng chính trong các hệ quản trị cơ sở dữ liệu
quan hệ. Đại số quan hệ là một phần không thể tách rời của mô hình dữ liệu quan
hệ. Nắm vững các kiến thức về đại số quan hệ tức là làm chủ được ngôn ngữ truy
vấn có cấu trúc SQL.
Email: namth@buh.edu.vn 95
5.1 PHÉP TOÁN MỘT NGÔI
5.1.1 Phép chọn
Phép chọn là toán tử một ngôi, được áp dụng với quan hệ R, tạo ra quan hệ mới
cùng lược đồ với quan hệ R, nhưng có số bộ nhỏ hơn hoặc bằng số bộ trong R.
Phép chọn được như là một bộ lọc, chỉ cho phép giữ lại những bộ thỏa mãn điều
kiện chọn, và bỏ qua những bộ còn lại. Nói cách khác, bộ dữ liệu xuất hiện trong
kết quả của phép chọn phải là bộ thỏa mãn điều kiện chọn C liên quan tới các
thuộc tính của quan hệ R. Phép chọn được thực hiện trên từng bộ của quan hệ, do
đó điều kiện chọn C không thể liên quan tới nhiều hơn một bộ. Phép chọn này
được ký hiệu là σC(R).
Phép chọn hoạt động như sau: áp dụng điều kiện chọn C cho từng bộ t của quan hệ
R bằng cách thay thế các thuộc tính A của R xuất hiện trong C bằng các thành phần
t[A] tương ứng trong bộ t. Nếu sau khi thay thế, điều kiện chọn C cho kết quả
TRUE, thì bộ t được chọn xuất hiện trong quan hệ kết quả của phép chọn σC(R),
ngược lại, bộ t không được chọn. Điều kiện chọn C là một biểu thức lôgic được
tạo từ nhiều mệnh đề lôgic có dạng:
<tên thuộc tính><toán tử so sánh><hằng số>,
hoặc
<tên thuộc tính><toán tử so sánh><tên thuộc tính>
với <tên thuộc tính> là tên thuộc tính của R, <toán tử so sánh> có thể là = < ≤ > ≥
≠, và <hằng số> là giá trị hằng số thuộc miền giá trị của thuộc tính có tên là <tên
thuộc tính>. Trong biểu thức lôgic các mệnh đề lôgic được nối với nhau bởi các
toán tử lôgic và (AND), hoặc (OR), hay phủ định (NOT). Ví dụ 5.1 và 5.2 thể hiện
hai ví dụ đơn giản liên quan đến phép chọn trên quan hệ EMPLOYEE (hình 5.1).
Email: namth@buh.edu.vn 96
Hình 5.1. Một thể hiện của quan hệ EMPLOYEE.
Hình 5.2. Phép chọn với điều kiện chọn đơn giản
VÍ DỤ 5.2: Phép chọn với điều kiện chọn phức tạp.
Với yêu cầu liệt kê tất cả nhân viên hoặc làm việc trong phòng 1 và có mức lượng
trên $85,000/năm, hoặc làm việc trong phòng 5 và có mức lương trên
Email: namth@buh.edu.vn 97
$90,000/năm, điều kiện chọn tương ứng sẽ là (DNum = 1 AND ESalary > 85,000)
OR (DNum = 5 AND ESalary >90,000). Kết quả của phép chọn với điều kiện
chọn này được thể hiện trong hình 5.3 dưới đây.
Hình 5.3. Kết quả của phép chọn với điều kiện chọn phức tạp.
Chú ý rằng các phép so sánh = < ≤ > ≥ ≠ được áp dụng cho các thuộc tính có miền
giá trị thuộc kiểu dữ liệu số, và kiểu dữ liệu thời gian. Đối với thuộc tính có miền
giá trị là chuỗi ký tự, phép so sánh hai chuỗi được thực hiện trên từng ký tự của
chúng. Đối với các thuộc tính có miền giá trị không thể sắp xếp, chỉ có hai toán tử
= và ≠ được áp dụng. Ví dụ, đối với miền giá trị của thuộc tính giới tính
dom(ESex) = {‘F’, ‘M’}, không thể thực hiện phép so sánh giữa hai giá trị giới
tính khác nhau.
Kết quả của phép chiếu πA1,A2,…,Ak (R) là một quan hệ mới có k thuộc tính, với A1,
A2,…, Ak là các thuộc tính của quan hệ R (và còn được gọi là danh sách thuộc tính
chiếu). Phép chiếu xoá các bộ trùng nhau (nếu có) để đảm bảo kết quả trả về là
một tập hợp gồm nhiều bộ.
Email: namth@buh.edu.vn 98
VÍ DỤ 5.3: Phép chiếu trên các thuộc tính đơn.
Sử dụng quan hệ EMPLOYEE với một thể hiện như trong hình 5.1, kết quả thực
hiện phép chiếu πEName,ESalary (EMPLOYEE) là một quan hệ có 2 thuộc tính và 21
bộ (hình 5.4a). Trong khi đó, phép chiếu πDNum, supervisorSSN (EMPLOYEE) lại cho
ra một quan hệ có 2 thuộc tính với 12 bộ mà thôi (hình 5.4b).
Hai quan hệ R(A1,A2,…,An) và S(B1,B2,…,Bn) được gọi là khả hợp nếu có cùng bậc
n và dom(Ai) = dom(Bi), ∀i∈{1,…,n}. Điều này có nghĩa là hai quan hệ R và S có
Email: namth@buh.edu.vn 99
tính khả hợp, nếu có cùng số thuộc tính, và cùng miền giá trị cho từng cặp thuộc
tính tương ứng.
Chúng ta định nghĩa các phép toán tập hợp trên hai quan hệ có tính khả hợp R và S
như sau:
Phép hợp: kết quả của phép hợp, ký hiệu R ∪ S, là một quan hệ gồm các
bộ hoặc thuộc R, hoặc thuộc S, hoặc thuộc cả hai. Phép hợp tự bỏ các bộ
trùng nhau (nếu có): R ∪ S = {t | t ∈ R ∨ t ∈ S}
Phép giao: kết quả của phép giao, ký hiệu R ∩ S, là một quan hệ gồm các
bộ vừa thuộc R, vừa thuộc S: R ∩ S = {t | t ∈ R ∧ t ∈ S}
Phép trừ: kết quả của phép trừ, kỳ hiệu R − S, là một quan hệ gồm các bộ
chỉ thuộc R nhưng không thuộc S: R − S = {t | t ∈ R ∧ t ∉ S}
(2) Để liệt kê những nhân viên trong phòng 1 và không có lương trên 90,000,
chúng ta áp dụng phép trừ giữa hai quan hệ (hình 5.9):
RESULT ← RESULT1 – RESULT2
Tiếp theo, chúng ta tìm hiểu phép nhân chéo, được ký hiệu là ×. Đây là một phép
toán hai ngôi, và các quan hệ tham gia phép toán này không bắt buộc phải là khả
hợp. Phép toán này được dùng để tổ hợp các bộ từ hai quan hệ.
Nói chung, kết quả của phép nhân chéo của hai quan hệ R(A1,A2,…,An) và
S(B1,B2,…,Bm) là quan hệ Q(A1,A2,…,An,B1,B2,…,Bm) có n+m thuộc tính. Mỗi bộ
trong quan hệ kết quả Q là tổ hợp của một bộ trong R với một bộ trong S. Vì vậy,
nếu quan hệ R có nR bộ, quan hệ S có nS bộ, thì quan hệ kết quả Q = R × S có nR*nS
bộ. Trong trường hợp hai quan hệ R và S có những thuộc tính trùng tên, chúng ta
cần sử dụng tên lược đồ quan hệ theo sau là tên thuộc tính, ví dụ R.A và S.A.
VÍ DỤ 5.7: Sử dụng phép chọn và phép chiếu sau phép nhân chéo.
Để thực hiện yêu cầu truy vấn danh sách nhân viên cùng tên phòng ban quản lý
họ, chúng ta sử dụng biểu thức sau đây:
πEname, ESalary, supervisorSSN, DName (σDnumber = DNum(EMPLOYEE × DEPARTMENT))
Với yêu cầu trên đây, trước tiên chúng ta cần phải nhân chéo hai quan hệ
EMPLOYEE và DEPARTMENT để nhận về tất cả những khả năng có thể xảy
ra giữa một nhân viên với một phòng ban. Để loại bỏ những sự kết hợp không phù
hợp, chúng ta sử dụng một phép chọn trên quan hệ thu được sau phép nhân chéo.
Quan hệ kết quả của câu truy vấn trên được minh họa trong hình 5.11
Quan hệ kết quả Q của phép kết theta giữa hai quan hệ R(A1,…,An) và S(B1,…,Bm)
có lược đồ Q(A1, …, An, B1, …, Bm). Trong trường hợp R và S có thuộc tính cùng
tên là V, chúng ta cần sử dụng ký hiệu R.V và S.V để phân biệt chúng trong lược
đồ của quan hệ kết quả Q.
Phép kết theta giữa hai quan hệ R và S dựa trên điều kiện C có thể được hiểu như
là phép chọn trên điều kiện C đối với kết quả trả về của phép nhân chéo giữa R và
S, tức là R ⋈C S = σC(R × S).
Trong ví dụ 5.7, từng bộ trong quan hệ kết quả đều có giá trị giống nhau tại thuộc
tính DNumber và thuộc tính DNum, bởi vì quan hệ này là kết quả của một phép
kết bằng giữa hai thuộc tính này. Từ đó, chúng ta nhận thấy rằng xuất hiện hai
thuộc tính trong cùng quan hệ có giá trị giống nhau tại từng bộ là không cần thiết.
Kết tự nhiên là một dạng khác của phép kết, trong đó (các) cặp thuộc tính được
dùng để kết bằng chỉ xuất hiện một lần duy nhất trong quan hệ kết quả. Chính vì
thế, phép kết tự nhiên yêu cầu tên của hai (hoặc mỗi cặp) thuộc tính kết phải giống
nhau. Trong trường hợp điều kiện này không thỏa mãn, trước khi thực hiện phép
kết tự nhiên, chúng ta cần đổi tên các (cặp) thuộc tính đó. Theo định nghĩa này, kết
tự nhiên là một dạng kết bằng trong đó điều kiện bằng được kiểm tra đối với mọi
cặp thuộc tính cùng tên trong cả hai quan hệ.
Chúng ta cũng có thể định nghĩa phép kết tự nhiên như sau:
Q ← R *(<dsach1>,<dsach2>)S
Trong định nghĩa này, <dsach1> là danh sách i thuộc tính của R, và <dsach2> là
danh sách i thuộc tính của S. Hai danh sách này được dùng để xác định các điều
kiện so sánh bằng giữa từng cặp thuộc tính tương ứng, và các điều kiện này được
nói với nhau bằng phép toán lôgic AND. Chỉ các thuộc tính của quan hệ R –
<dsach1> – được giữ trong quan hệ kết quả Q.
VÍ DỤ 5.9: Thực hiện phép kết tự nhiên trên hai thuộc tính trùng tên.
Khi thực hiện phép kết tự nhiên trên thuộc tính ESSN đối với hai quan hệ
EMPLOYEE và DEPENDENT, chúng ta chỉ cần thực hiện câu truy vấn sau đây:
EMP_DEP ← πESSN, EName, ESalary, DName, Dbirthdate
EMPLOYEE*DEPENDENT
Kết quả truy vấn này được thể hiện trong hình 5.13.
Trường hợp tổng quát, nếu R có nR bộ, và S có nS bộ, kết quả của phép kết R ⋈<điều
kiện kết> S sẽ có từ 0 đến nR*nS bộ. Như chúng ta thấy, phép kết được dùng để tổ hợp
dữ liệu từ nhiều quan hệ khác nhau và kết quả được lưu trữ trong một quan hệ
đơn. Phép kết này còn được gọi là INNER JOIN để phân biệt với một dạng khác
của phép kết – đó là OUTER JOIN.
Tập hợp các phép toán {σ, π, ∪, −, ×} được gọi là tập đầy đủ các phép toán đại số
quan hệ, nghĩa là tất cả các phép toán đại số quan hệ đều có thể được biểu diễn
như là một dãy các phép toán từ tập hợp này. Ví dụ, phép giao có thể được viết lại
như sau:
R ∩ S ≡ (R ∪ S) – ((R – S) ∪ (S – R))
Phép kết được thay thế bằng sự kết hợp của phép chọn và phép nhân chéo như sau:
R ⋈<dkien> S ≡ σ<dkien> (R × S)
Phép kết tự nhiên có thể được biểu diễn bằng dãy bốn phép toán đại số quan hệ
theo thứ tự là phép đổi tên, phép nhân chéo, phép chọn và phép chiếu.
Dạng yêu cầu dữ liệu thứ hai mà các phép toán cơ bản trong đại số quan hệ không
thể biểu diễn được là yêu cầu gom nhóm các bộ trong quan hệ theo giá trị của các
thuộc tính của nó, và sau đó áp dụng các hàm kết hợp lên từng nhóm một cách độc
lập. Ví dụ như yêu cầu thống kê mức thu nhập bình quân của mỗi đơn vị trong
công ty.
Chúng ta có thể định nghĩa phép toán hàm kết hợp, ký hiệu là ℑ (đọc là F), mô tả
các kiểu yêu cầu dữ liệu trên như sau:
VÍ DỤ 5.10: Sử dụng phép gom nhóm cùng các hàm phép hợp.
Để liệt kê số lượng nhân viên, mức lương trung bình của nhân viên trong từng đơn
vị, chúng ta sử dụng biểu thức sau:
ρR(depNum, No_Of_Employees, Avg_Of_Salary)
(DNumℑ(COUNT ESSN),(AVERAGE ESalary) (EMPLOYEE))
Kết quả của phép toán trong hình 5.14. Ở đây, chúng ta sử dụng phép đổi tên, để
từ đó, quan hệ kết quả có ba thuộc tính mới, lần lượt là DNum ứng với mã số đơn
vị, No_Of_Employees ứng với số nhân viên, Avg_Of_Salary ứng với mức lương
trung bình của các nhân viên trong đơn vị đó.
Cũng trong ví dụ này, nếu chúng ta không sử dụng phép gom nhóm, hoặc không
cung cấp thuộc tính gom nhóm, thì các hàm kết hợp sẽ được áp dụng lên tất cả các
bộ trong quan hệ. Chính vì thế, quan hệ kết quả chỉ có một bộ duy nhất như trong
hình 5.16.
Hình 5.14. Phép gom nhóm sử dụng phép đổi tên trong quan hệ kết quả
Hình 5.16. Phép gom nhóm không sử dụng thuộc tính gom nhóm
Chúng ta cần phải ghi nhớ rằng, sau khi thực hiện các hàm kết hợp trên quan hệ,
kết quả trả về là một quan hệ chứ không phải là số – thậm chí nếu kết quả trả về
chỉ là một giá trị đơn lẻ. Chính vì vậy, đại số quan hệ là một hệ thống đóng.
Các phép kết ngoài (outer join) được dùng khi chúng ta muốn duy trì tất cả các bộ
từ R, hoặc từ S, hoặc từ cả R và S trong quan hệ kết quả của phép kết, cho dù
chúng có hay không có bộ tương ứng trong quan hệ còn lại. Phép kết được trình
bày trong mục 5.3 còn được gọi là phép kết trong (inner join).
Dễ dàng nhận thấy rằng (hình 5.17), kết quả trả về chỉ chứa thông tin liên quan
đến 4 đơn vị, trong khi chúng ta biết chắc chắn rằng có 5 đơn vị trong cơ sở dữ
liệu COMPANY. Như vậy, kết quả này không phù hợp với yêu cầu của bài toán
(liệt kê tất cả đơn vị).
Hình 5.17. Kết quả phép kết trong với điều kiện kết DNumber = DNum giữa
DEPARTMENT và PROJECT.
Chúng ta có thể khắc phục sai sót trên bằng cách sử dụng phép kết ngoài như sau:
RESULT ← πDNumber, DName, mgrSSN, PNumber, PName (DEPARTMENT
⋉DNumber=DNum PROJECT)
Kết quả của phép kết này được thể hiện trong hình 5.18.
Hình 5.18. Kết quả phép kết ngoài trái với điều kiện kết DNumber = DNum
giữa DEPARTMENT và PROJECT.
5.4.1 Biến bộ
Phép tính quan hệ trên bộ được xây dựng dựa trên các biến bộ. Mỗi biến bộ đại
diện cho một quan hệ, giá trị của biến bộ lần lượt là các bộ của quan hệ đó. Biểu
thức phép tính quan hệ trên bộ đơn giản có dạng:
{t | BIỂU_THỨC_ĐIỀU_KIỆN(t)}
với t là một biến bộ, và BIỂU_THỨC_ĐIỀU_KIỆN(t) là biểu thức điều kiện với
đối số t. Kết quả của câu truy vấn này là một tập hợp gồm các bộ t thỏa mãn điều
kiện được nêu trong BIỂU_THỨC_ĐIỀU_KIỆN.
5.4.2 Biểu thức và công thức trong phép tính quan hệ trên bộ
Biểu thức phép tính quan hệ trên bộ tổng quát có dạng:
{t1.Aj, t2.Ak, …, tn.Am | C(t1, t2, …, tn, tn+1, …, tn+m)}
với t1, t2, …, tn, tn+1, …, tn+m là các biến bộ, và Ai là thuộc tính của quan hệ mà ti
đại diện, và C là biểu thức điều kiện của phép tính quan hệ trên bộ. Biểu thức điều
kiện được xây dựng từ các công thức nguyên tố sau:
1) R(ti) là một công thức nguyên tố, với R là tên quan hệ, ti là biến bộ. Công
thức này cho biết biến bộ ti là một bộ của quan hệ có tên là R.
2) ti.A θ tj.B là một công thức nguyên tố, với ti, tj là các biến bộ, A là thuộc
tính của quan hệ do ti đại diện, B là thuộc tính của quan hệ do tj đại diện. θ
là toán tử so sánh = < ≤ > ≥ ≠.
3) ti.A θ c là một công thức nguyên tố, với ti là biến bộ, A là thuộc tính của
quan hệ do ti đại diện, c là giá trị hằng, θ là toán tử so sánh = < ≤ > ≥ ≠.
Các công thức nguyên tố nói trên có kết quả là đúng hoặc sai, kết quả này còn
được gọi là chân trị của công thức nguyên tố. Công thức nguyên tố (1) có chân trị
là đúng, nếu t là một bộ của quan hệ R; ngược lại, công thức (1) có chân trị là sai.
Các công thức nguyên tố (2), (3) có chân trị đúng, nếu giá trị thuộc tính của các bộ
liên quan thỏa mãn điều kiện so sánh đã nêu.
Công thức được xây dựng từ các công thức nguyên tố được kết nối với nhau bằng
các toán tử lô-gic như là AND, OR, và NOT. Công thức được định nghĩa theo quy
nạp toán học như sau:
1) Mọi công thức nguyên tố đều là công thức
2) Nếu P là công thức, thì
a. (P) là công thức, cho giá trị đúng khi P đúng; ngược lại, cho giá trị sai.
Bây giờ chúng ta tiếp tục phát biểu quy tắc (4) và (5) đối với định nghĩa về công
thức đã nêu ở phần 5.4.2:
4) Nếu F là công thức, thì (∃t)(F) cũng là công thức, với t là một biến bộ.
Công thức (∃t)(F) cho ra kết quả đúng, nếu công thức F cho giá trị đúng với
ít nhất một bộ t nào đó. Ngược lại, (∃t)(F) cho ra kết quả sai.
5) Nếu F là công thức, thì (∀t)(F) cũng là công thức, với t là một biến bộ.
Công thức (∀t)(F) cho ra kết quả đúng, nếu công thức F cho giá trị đúng
với mọi bộ t. Ngược lại, (∀t)(F) cho ra kết quả sai.
Email: namth@buh.edu.vn 115
VÍ DỤ 5.14: Sử dụng lượng hóa tồn tại trong phép tính quan hệ trên bộ.
Cho biết tên và lương của tất cả nhân viên làm việc trong phòng Nghiên cứu:
{t.EName, t.ESalary | t∈EMPLOYEE ∧ (∃d)(d∈DEPARTMENT ∧
d.depName = N‘Phòng Nghiên cứu’ ∧ d.DNum = t.dNum)}
Chỉ những biến bộ tự do trong biểu thức phép tính quan hệ mới có thể xuất hiện
trong phần kết quả (bên trái của ký hiệu |). Ở đây, t là biến bộ tự do duy nhất. Nếu
một bộ t nào đó thỏa mãn các điều kiện, thì các giá trị ứng với thuộc tính EName,
ESalary được xuất hiện trong phần kết quả. Điều kiện t ∈ EMPLOYEE cho ra kết
quả đúng, khi t nhận giá trị là một bộ trong quan hệ EMPLOYEE. Điều kiện
d.depName = N‘Phòng Nghiên cứu’ là điều kiện chọn ứng với điều kiện chọn
trong đại số quan hệ. Điều kiện d.DNumber = t.DNum là điều kiện kết, với vai trò
tương tự như trong phép kết JOIN (xem mục 4.3).
5.4.4 Biến đổi tương đương giữa lượng hóa tồn tại và lượng hóa phổ
dụng
Phần tiếp theo chúng ta tìm hiểu các phép biến đổi tương đương từ biểu thức
lượng hóa tồn tại sang biểu thức lượng hóa phổ dụng, và ngược lại. Các phép biến
đổi này hoạt động trên ý nghĩa toán học của các biểu thức luận lý. Chúng ta có các
phép biến đổi tương đương sau:
(∀x)( P( x)) ≡ ¬(∃x)(¬P( x))
(∃x)( P( x)) ≡ ¬(∀x)(¬P( x))
(∀x )( P ( x) ∧ Q ( x)) ≡ ¬(∃x)(¬P ( x) ∨ ¬Q( x))
(∀x )( P ( x) ∨ Q ( x)) ≡ ¬(∃x)(¬P ( x) ∧ ¬Q( x))
(∃x)( P ( x ) ∧ Q( x)) ≡ ¬(∀x)(¬P ( x) ∨ ¬Q( x))
(∃x)( P ( x) ∨ Q( x)) ≡ ¬(∀x)(¬P( x) ∧ ¬Q( x))
Một khi chúng ta sử dụng các phép toán ∀ (với mọi), ∃ (tồn tại), và ¬ (phủ định)
trong biểu thức phép tính, chúng ta phải đảm bảo rằng biểu thức này cho ra kết
quả có ý nghĩa nào đó. Biểu thức an toàn trong phép tính quan hệ đảm bảo rằng
kết quả nhận được là một tập hợp có số phần tử là hữu hạn.
Chúng ta có thể định nghĩa biểu thức an toàn dựa trên miền giá trị của biểu thức
phép tính quan hệ trên bộ: là tập hợp tất cả các giá trị cố định trong công thức
cũng như các giá trị xuất hiện trong quan hệ tham gia công thức này. Một biểu
thức được gọi là an toàn nếu kết quả trả về nằm trong miền giá trị của nó.
Khác với phép tính quan hệ trên bộ khi biến bộ đại diện cho tất cả các bộ trong
quan hệ, biến miền trong phép tính quan hệ trên miền đại diện cho tất cả các giá trị
trong miền giá trị tương ứng. Biểu thức phép tính quan hệ trên miền có dạng như
sau:
{x , x
1 2 ,..., x n P( x1 , x 2 ,..., x n , x n +1 ,..., x n + m )}
với x1, x2, …, xn, xn+1, …,xn+m là những biến bộ đại diện cho các miền giá trị (thuộc
tính) tương ứng. và P là biểu thức điều kiện của phép tính quan hệ trên miền. Kết
quả trả về của biểu thức này là quan hệ bậc n tạo bởi các biến miền x1, x2, …, xn.
Biểu thức điều kiện được xây dựng từ các công thức nguyên tố sau:
1) <x1,x2,…,xj> ∈ R là một công thức nguyên tố, với R là tên quan hệ, xi là
biến miền. Công thức này cho biết <x1,x2,…,xj> là một bộ của quan hệ
có tên là R. xi là giá trị tương ứng với thuộc tính thứ i trong bộ.
2) xiθxk là một công thức nguyên tố, với xi, xk là các biến miền, θ là toán tử
so sánh = < ≤ > ≥ ≠.
3) xiθc là một công thức nguyên tố, với xi là biến miền, c là giá trị hằng, θ
là toán tử so sánh = < ≤ > ≥ ≠.
Các công thức nguyên tố có chân trị, tức là kết quả trả về hoặc TRUE, hoặc
FALSE. Công thức (1) cho ra kết quả TRUE khi <x1,x2,…,xj> có giá trị tương ứng
với một bộ trong quan hệ R. Công thức (2), (3) cho ra kết quả là TRUE khi các
phép so sánh cho ra kết quả TRUE đối với từng giá trị của biến miền giá trị.
Tiếp theo, chúng tôi thực hiện một số câu truy vấn minh họa bằng phép tính quan
hệ trên miền.
Đầu tiên, chúng tôi giới thiệu đại số quan hệ với các phép toán đi từ cơ bản đến
nâng cao kèm theo các ví dụ minh họa giúp người đọc hiểu rõ vai trò, cũng như
cách sử dụng các phép toán riêng lẻ, hoặc kết hợp chúng lại với nhau thành những
biểu thức đại số quan hệ phức tạp. Các phép toán đại số quan hệ có thể phân chia
thành hai nhóm, tùy theo số quan hệ tham gia trong đó. Chẳng hạn như phép toán
một ngôi bao gồm phép chọn, phép chiếu, và phép đổi tên. Phép toán hai ngôi bao
gồm các phép toán trên tập hợp, phép nhân chéo, phép kết, và phép kết tự nhiên.
Sau khi tìm hiểu các phép toán cơ bản, chúng ta tiếp tục tìm hiểu các phép toán
nâng cao với phép toán sắp xếp, phép toán gom nhóm, và các phép kết mở rộng.
Tất cả các phép toán này được gọi tên là tập đầy đủ các phép toán đại số quan hệ,
sử dụng chúng có thể hiện thực được mọi yêu cầu truy vấn trên dữ liệu quan hệ.
Tiếp theo chúng ta tìm hiểu một ngôn ngữ hình thức khác của mô hình dữ liệu
quan hệ, đó là phép tính quan hệ. Phép tính quan hệ được xây dựng trên nền tảng
lôgic vị từ, một nhánh của toán lôgic. Phép tính quan hệ được chia làm hai loại:
phép tính quan hệ trên bộ và phép tính quan hệ trên miền. Chúng tôi cũng minh
họa cách thức áp dụng các phép tính quan hệ để hiện thực các yêu cầu truy vấn
trên dữ liệu quan hệ.
Cuối cùng, chúng ta thực hiện phép so sánh giữa đại số quan hệ và phép tính quan
hệ. Nếu đại số quan hệ cho biết cách thức thực hiện câu truy vấn, thì phép tính
quan hệ lại tập trung vào việc xác định kết quả trả về là gì. Trong khi đại số quan
hệ cho phép thực hiện sắp xếp, gom nhóm, thì phép tính quan hệ định nghĩa lượng
hóa phổ dụng và lượng hóa tồn tại.
6
THIẾT KẾ CƠ SỞ DỮ LIỆU
Mục tiêu
Chương này cung cấp cho người đọc kiến thức về quy trình thiết kế cơ sở dữ liệu
quan hệ. Quy trình này trải qua ba bước chính: đặc tả yêu cầu của người sử dụng,
thiết kế cơ sở dữ liệu ý niệm và thiết kế cơ sở dữ liệu luận lý. Kết quả cuối cùng
của quá trình này chính là một lược đồ cơ sở dữ liệu quan hệ đáp ứng đầy đủ các
yêu cầu về dữ liệu của người sử dụng.
Nội dung
Quy trình thiết kế cơ sở dữ liệu quan hệ.
Thiết kế cơ sở dữ liệu ý niệm.
Thiết kế cơ sở dữ liệu luận lý.
Hoạt động thiết kế cơ sở dữ liệu cũng như các hoạt động thiết kế khác phụ thuộc
rất nhiều vào quan điểm của người thiết kế. Do đó, với cùng một bản đặc tả yêu
cầu dữ liệu giống nhau, có thể có nhiều thiết kế cơ sở dữ liệu khác nhau. Trong
trường hợp này, chúng ta cần chọn lựa một cấu trúc cơ sở dữ liệu hiệu quả liên
quan đến các vấn đề khai thác trong tương lai, cụ thể như sau:
Thời gian thực hiện các yêu cầu truy xuất dữ liệu.
Thời gian sao lưu và phục hồi cơ sở dữ liệu khi có sự cố bất thường.
Chi phí hoạt động xây dựng, cài đặt và triển khai cơ sở dữ liệu.
Tính ổn định trong một thời gian dài, phù hợp với định hướng về chiến lược
và mục đích sử dụng cơ sở dữ liệu.
Quy trình thiết kế cơ sở dữ liệu là một quá trình gồm nhiều bước thực hiện kế tiếp
nhau, bắt đầu từ hoạt động phân tích yêu cầu của người sử dụng thông qua bản đặc
tả yêu cầu dữ liệu, xây dựng các bản thiết kế ý niệm, thiết kế luận lý, thiết kế vật
lý và kết thúc bằng hoạt động cài đặt và triển khai cơ sở dữ liệu. Chúng ta có thể
áp dụng các phương pháp phát triển hệ thống vào hoạt động thiết kế cơ sở dữ liệu,
mà cụ thể là hai phương pháp thác nước và phương pháp xoắn ốc.
Kết thúc giai đoạn này nhân viên thiết kế phải cung cấp được bản đặc tả yêu cầu
dữ liệu của người sử dụng. Bản đặc tả thể hiện chi tiết tổ chức dữ liệu, các mối
liên hệ giữa các đối tượng dữ liệu, cũng như mục đích và giải pháp để thực hiện
các thao tác xử lý hoặc khai thác dữ liệu. Bản đặc tả được trình bày bằng ngôn ngữ
tự nhiên, ngắn gọn, dễ hiểu để người sử dụng có thể xem và đóng góp ý kiến.
Bản thiết kế cơ sở dữ liệu ý niệm là một bản thiết kế tổng thể, dựa trên nhiều bản
thiết kế nhỏ hơn được xây dựng trên cơ sở phân tích nhu cầu dữ liệu của từng
nhóm người sử dụng khác nhau trong hệ thống. Nhờ vậy mà bản thiết kế của
Nhân viên thiết kế cơ sở dữ liệu luận lý cần cân nhắc giữa việc loại bỏ mọi dư
thừa trong dữ liệu để tối ưu hóa dung lượng bộ nhớ sử dụng cho cơ sở dữ liệu, hay
là chấp nhận dư thừa trong dữ liệu nhưng nhờ đó lại tăng tốc độ xử lý các yêu cầu
dữ liệu có liên quan.
Cơ sở dữ liệu ý niệm thực chất là tập hợp tất cả những khái niệm, ý niệm xuất hiện
trong thế giới thực mà cơ sở dữ liệu cần lưu trữ. Cơ sở dữ liệu ý niệm không được
cài đặt trên bất kỳ hệ quản trị cơ sở dữ liệu nào, nó chỉ sử dụng để chúng ta có thể
hình dung ra tổ chức của dữ liệu và mối liên quan giữa các dữ liệu này với nhau.
Chính vì vậy, mô hình thực thể kết hợp là một sự lựa chọn phù hợp.
Bước 1: Xác định yêu cầu về dữ liệu lưu trữ của hệ thống, phân tích các thành
phần dữ liệu của hệ thống. Bước này bao gồm ba nội dung:
(1.1) Xác định các tập thực thể, tức là các sự vật, sự việc, … cần được hệ
thống lưu trữ.
(1.2) Xác định các thuộc tính cho từng tập thực thể, mỗi thuộc tính là một đặc
trưng giúp xác định tập thực thể.
(1.3) Xác định các liên kết giữa các tập thực thể, các thuộc tính cho từng liên
kết. Liên kết thực chất là những ràng buộc về mặt cấu trúc của dữ liệu.
Bước 3: Tích hợp các sơ đồ đơn giản trong bước 2 thành một sơ đồ tổng thể về tổ
chức dữ liệu lưu trữ của hệ thống. Hoàn thiện bản thiết kế bằng cách bổ sung các
thông tin có liên qua: thuộc tính của liên kết, vai trò và số lượng của từng tập thực
thể tham gia trong liên kết.
Bước 4: Hoàn thiện bản thiết kế. Loại bỏ các tập thực thể, thuộc tính, hay liên kết
dư thừa trong bản thiết kế ở bước 3.
Quá trình thiết kế cơ sở dữ liệu ý niệm cho ví dụ này lần lượt diễn ra các bước như
sau:
Bước 1: Xác định yêu cầu về dữ liệu lưu trữ của hệ thống, phân tích các thành
phần dữ liệu của hệ thống:
(1.1) Xác định các tập thực thể. Với câu hỏi “hệ thống lưu trữ những sự vật,
sự việc gì?” chúng ta nhận thấy có bốn tập thực thể cần được biểu diễn
trong mô hình. Bốn tập thực thể đó là: Department (Đơn vị),
Employee (Nhân viên), Project (Dự án), và Dependent (Thân nhân).
(1.2) Xác định các thuộc tính. Với câu hỏi “với mỗi tập thể chúng ta có nhu
cầu muốn biết những gì? ” chúng ta có thể xác định các thuộc tính cho
từng tập thực thể. Cụ thể như sau:
Đơn vị Department
Tên đơn vị DName
Số hiệu đơn vị DNumber
Các địa điểm DLocation
Dự án Project
Tên dự án PName
Số hiệu dự án PNumber
Địa điểm PLocation
Nhân viên Employee
Họ và tên EName
Mã số ESSN
Giới tính ESex
Mức lương ESalary
Ngày sinh EBirthdate
(1.3) Xác định các liên kết. Với câu hỏi “giữa các tập thực thể này có mối
liên hệ gì không?Liên kết có đòi hỏi thông tin riêng không? ” chúng ta
có thể xác định liên kết giữa các tập thực thể, và các thuộc tính (nếu có)
của nó. Cụ thể như sau:
Quản lý Manage
Đơn vị Department
Nhân viên Employee
Thời gian bổ nhiệm MgrStartdate
Điều hành Control
Đơn vị Department
Dự án Project
Biên chế Works for
Đơn vị Department
Nhân viên Employee
Thời gian bắt đầu làm việc EStartdate
Tham gia Works on
Nhân viên Employee
Dự án Project
Số giờ làm việc trong tuần Workhours
Giám sát Supervise
Nhân viên Employee
Nhân viên Employee
Bước 2: Mô hình hóa các yêu cầu về dữ liệu bằng các sơ đồ. Các sơ đồ ứng với ví
dụ mẫu được minh họa trong hình sau đây.
Bước 3: Tích hợp các sơ đồ đơn giản trong bước 2 thành một sơ đồ tổng thể về tổ
chức dữ liệu lưu trữ của hệ thống.
Bước 4: Hoàn thiện bản thiết kế. Tinh chỉnh hệ thống với các giả thuyết bổ sung
như sau:
Nhân viên trong công ty được phân chia làm nhiều nhóm khác nhau,
dựa vào nhiệm vụ mà từng nhân viên đảm nhận trong công ty. Chúng ta
có ba nhóm nhân viên: Nhân viên văn phòng (Secretary), Nhân viên kỹ
thuật (Engineer) và Nhân viên lái xe (Driver). Mỗi nhóm nhân viên
ngoài những đặc trưng chung, còn có các đặc trưng riêng.
Công ty duy trì thông tin về người thân đối với nhân viên trong nhóm
nhân viên kỹ thuật thay vì đối với toàn bộ nhân viên trong công ty.
Tất cả các khái niệm có liên quan đến mô hình thực thể kết hợp và mô hình thực
thể kết hợp mở rộng đã được trình bày ở chương 2 và chương 3. Do đó, trong
chương này, chúng ta tập trung nghiên cứu quy trình thiết kế cơ sở dữ liệu luận lý
từ mô hình thực thể kết hợp (mở rộng).
Quy trình chuyển đổi cơ sở dữ liệu quan hệ từ mô hình thực thể kết hợp:
Quy tắc 1: Ánh xạ các kiểu thực thể thường. Với mỗi kiểu thực thể
thường E trong lược đồ E/R, chúng ta tạo một quan hệ R với tất cả các
thuộc tính của E.
Chú ý rằng nếu E có thuộc tính kết hợp, mỗi thành phần trong thuộc tính kết hợp
này trở thành một thuộc tính đơn trong R. Tiếp theo, chúng ta chọn một trong số
các khóa của E làm khóa chính của R. Các khóa còn lại trở thành khóa phụ trong
R. Nếu khóa được chọn trong E là thuộc tính kết hợp, thì tập hợp các thuộc tính
đơn tương ứng trong R cùng nhau tạo nên khóa chính của R.
Các quan hệ được tạo từ việc ánh xạ các kiểu thực thể còn được gọi là các quan hệ
thực thể vì mỗi bộ (hàng) tương ứng với một thực thể.
Ngoài ra, chúng ta thêm vào R thuộc tính khóa chính của các quan hệ tương ứng
với các kiểu thực thể thường E xác định W. Các thuộc tính này trở thành các khóa
ngoại trong R. Khóa chính của quan hệ R là tổ hợp của các thuộc tính khóa ngoại
vừa mới thêm vào cùng với khóa bộ phận của tập thực thể yếu W (nếu có).
Trong trường hợp kiểu thực thể yếu E2 được xác định bởi kiểu thực thể E1, mà bản
thân E1 cũng là một kiểu thực thể yếu, E1 cần phải được ánh xạ trước, tiếp theo sau
mới đến lượt E2 được ánh xạ từ E1.
DEPENDENT
DName
ESSN
DSex
DBirthdate
DRelationship
VÍ DỤ 6.3: Ánh xạ kiểu liên kết hai ngôi một – một sang quan hệ.
Trong ví dụ COMPANY, chúng ta ánh xạ kiểu liên kết 1:1 có tên là MANAGES
trong hình 6.3 bằng cách chọn kiểu thực thể DEPARTMENT có vai trò như S bởi
vì mọi đơn vị đều có một trưởng đơn vị. Chúng ta thêm khóa chính của quan hệ
EMPLOYEE vào như là khóa ngoại của quan hệ DEPARTMENT, đồng thời đổi
EMPLOYEE DEPARTMENT
ESSN DNumber
EName DName
ESalary mgrSSN
ESex mgrStartdate
EBirthdate
EStartdate
Hình 6.6. Ánh xạ kiểu liên kết hai ngôi một – một sang quan hệ.
Chú ý rằng thay vì thêm khóa chính của quan hệ EMPLOYEE vào như là khóa
ngoại của quan hệ DEPARTMENT, chúng ta có thể làm ngược lại, tức là thêm
khóa chính của quan hệ DEPARTMENT vào như là khóa ngoại của quan hệ
EMPLOYEE. Tuy nhiên, quan hệ EMPLOYEE lúc này sẽ có nhiều giá trị null
tại thuộc tính khóa ngoại đó bởi vì không phải nhân viên nào cũng làm trưởng đơn
vị. Nếu chỉ có 10% nhân viên làm trưởng đơn vị, có nghĩa là có tới 90% giá trị tại
thuộc tính khóa ngoại sẽ có giá trị là NULL. Ngoài ra, chúng ta còn có thể thêm
khóa chính của quan hệ này trở thành khóa ngoại của quan hệ kia và ngược lại, tuy
nhiên giải pháp này làm cho cơ sở dữ liệu của chúng ta trở nên cồng kềnh, và có
nhiều giá trị NULL không cần thiết.
(2) Hướng tiếp cận quan hệ liên kết ghép trộn: Chúng ta có thể trộn hai kiểu
thực thể và liên kết của chúng vào thành một quan hệ duy nhất. Hướng
Emai: namth@buh.edu.vn 143
ngày phù hợp khi cả hai tập thực thể tham gia liên kết đều toàn vẹn, nghĩa
là mỗi thực thể của tập thực thể này liên kết với đúng một thực thể của tập
thực thể kia và ngược lại.
(3) Hướng tiếp cận quan hệ liên kết: Chúng ta tạo quan hệ thứ ba R để kết hợp
khóa chính của hai quan hệ S và T biểu diễn tương ứng cho các kiểu thực
thể kết hợp. Quan hệ R được gọi là quan hệ liên kết (thỉnh thoảng gọi là
bảng dò tìm) bởi vì mỗi bộ trong R biểu diễn cho một thực thể liên kết liên
quan đến một bộ trong S với một bộ trong T.
Điều này hoàn toàn thực hiện được bởi vì mỗi thể hiện của quan hệ phía N (nhiều)
đều liên quan đến tối đa một thể hiện của quan hệ phía 1. Ngoài ra, chúng ta bổ
sung vào quan hệ T các thuộc tính đơn giản (hoặc các thành phần đơn giản của
thuộc tính kết hợp) của kiểu liên kết R.
VÍ DỤ 6.4: Ánh xạ kiểu liên kết hai ngôi một – nhiều sang quan hệ.
Trong cơ sở dữ liệu COMPANY, chúng ta ánh xạ các kiểu liên kết 1:N có tên
WORKS IN, CONTROLS, và SUPERVISES từ hình 6.3. Đối với WORKS IN,
chúng ta thêm thuộc tính khóa chính Number của DEPARTMENT vào
EMPLOYEE như là một khóa ngoại, đồng thời đặt tên thuộc tính này là DNum.
Với SUPERVISES, ta thêm khóa chính của EMPLOYEE vào thành khóa ngoại
của chính EMPLOYEE và đổi tên thuộc tính này thành supervisorSSN. Tương tự
như thế, đối với liên kết CONTROLS, ta thêm khóa chính của DEPARTMENT
vào PROJECT và đổi tên nó thành DNum.
Hình 6.7. Ánh xạ kiểu liên kết hai ngôi một – nhiều sang quan hệ
Ngoài ra, chúng ta có thể sử dụng quan hệ liên kết để thể hiện mối liên kết hai
ngôi 1:N. Chúng ta tạo quan hệ R độc lập, với các thuộc tính của nó là khóa chính
của hai quan hệ S và T, thuộc tính khóa chính của S giữ vai trò là khóa chính trong
R. Phương án này chỉ phù hợp với trường hợp quan hệ S có ít bộ nhằm tránh
trường hợp trong R có nhiều giá trị NULL tại các thành phần khóa ngoại.
VÍ DỤ 6.5: Ánh xạ kiểu liên kết hai ngôi nhiều – nhiều sang quan hệ.
Trong cơ sở dữ liệu COMPANY, chúng ta ánh xạ kiểu liên kết WORKS ON từ
hình 6.3 bằng cách tạo quan hệ mới có tên WORKSON. Chúng ta thêm khóa
chính của hai quan hệ PROJECT và EMPLOYEE (lần lượt là PNumber và
ESSN) vào thành các thuộc tính khóa ngoại của quan hệ WORKSON. Đồng thời,
chúng ta thêm vào quan hệ WORKSON một thuộc tính có tên workHours để biểu
diễn thuộc tính HOURS của kiểu liên kết WORKS ON. Khóa chính của quan hệ
WORKSON là kết hợp của hai thuộc tính PNumber và ESSN.
Hình 6.8. Ánh xạ kiểu liên kết hai ngôi nhiều – nhiều sang quan hệ.
Chú ý rằng chúng ta có thể ánh xạ các kiểu liên kết 1:1 và 1:N bằng cách tương tự
như đối với trường hợp N:M với một quan hệ liên kết mà chúng ta đã được tìm
hiểu ở phần trước. Cách ánh xạ này tỏ ra hữu ích trong trường hợp không có nhiều
DEPARTMENT DEPLOCATION
DNumber DNum
DName DLocation
mgrSSN
mgrStartdate
Hình 6.10. Ánh xạ kiểu liên kết nhiều ngôi sang quan hệ.
6.3.2 Sự tương đồng giữa mô hình thực thể kết hợp với mô hình dữ liệu
quan hệ
Qua các thao tác biến đổi đã thực hiện ở trên, chúng ta thấy rằng có một sự tương
đồng giữa mô hình thực thể kết hợp và mô hình dữ liệu quan hệ. Bảng 6.1 tóm tắt
sự tương đồng về cấu trúc và ràng buộc giữa hai mô hình này.
Một điểm cần phải chú ý trong mô hình dữ liệu quan hệ là các kiểu liên kết không
được hiện một cách tường minh như trong mô hình E/R, thay vào đó, các kiểu liên
kết được thể hiện bởi hai thuộc tính A và B, thuộc tính thứ nhất là khóa chính của
quan hệ S, thuộc tính thứ hai là khóa ngoại trong quan hệ T, cả hai thuộc tính này
có cùng miền giá trị. Hai bộ trong quan hệ S và T gọi là có liên quan với nhau, nếu
chúng có cùng giá trị đối với hai thuộc tính A và B. Bằng một phép kết bằng (hoặc
phép kết tự nhiên nếu hai thuộc tính kết có cùng tên) với S.A và T.B, chúng ta có
thể kết hợp tất cả các bộ có liên quan với nhau từ S và T. Đây chính là thể hiện của
kiểu liên kết giữa S và T. Đối với kiểu liên kết hai ngôi 1:1 hay 1:N, chúng ta chỉ
cần sử dụng một phép kết bằng, nhưng đối với kiểu liên kết hai ngôi N:M, chúng
ta cần phải sử dụng hai phép kết bằng, trong khi đối với kiểu liên kết N ngôi,
chúng ta cần tới N phép kết bằng để thể hiện nó.
Điều thứ hai cần phải chú ý là mỗi thuộc tính đa trị trong mô hình E/R tương ứng
với một quan hệ trong mô hình dữ liệu quan hệ. Do mô hình dữ liệu quan hệ
không cho phép những kiểu dữ liệu phức tạp như danh sách hay tập hợp, do đó,
giá trị của thuộc tính đa trị phải được phân rã tương ứng với thuộc tính có kiểu dữ
liệu đơn giản.
6.3.3.1 Ánh xạ mối quan hệ chuyên biệt hóa và khái quát hóa giữa các
kiểu thực thể
Chúng ta có nhiều cách để hiện thức mối quan hệ giữa các lớp cha với các lớp con
theo hai hướng nhìn: chuyên biệt hóa và khái quát hóa. Lớp cha là khái quát hóa
của các lớp con, và ngược lại, mỗi lớp con là chuyên biệt hóa từ lớp cha. Từ quy
trình bảy bước chuyển đổi cơ sở dữ liệu quan hệ từ mô hình E/R, chúng ta bổ sung
thêm bước thứ 8 nhằm ánh xạ mối liên hệ chuyên biệt hóa giữa các kiểu thực thể
sang dữ liệu quan hệ.
Bước 8: Ánh xạ mối quan hệ chuyên biệt hóa và khái quát hóa
Giả định rằng chúng ta có m lớp con {S1, S2, …, Sm} và lớp cha tương ứng C, với
các thuộc tính của C là {k, a1, a2, …, an} với k là thuộc tính khóa chính của C.
Chúng ta có thể ánh xạ mối quan hệ nói trên sang mô hình dữ liệu quan hệ bằng
một trong bốn quy tắc sau đây:
Quy tắc 8A: Mỗi quan hệ ứng với một lớp. Chúng ta tạo quan hệ L cho lớp
C với các thuộc tính tương ứng là {k, a1, a2, …, an}, với k là khóa chính của
L. Tiếp theo, với mỗi lớp con Si, chúng ta tạo một quan hệ Li bao gồm các
thuộc tính của lớp Si cộng với thuộc tính khóa chính k của lớp C. Khóa
Emai: namth@buh.edu.vn 151
chính của Li cũng chính là khóa chính của L (tức là k). Quy tắc này áp dụng
cho mọi kiểu chuyên biệt hóa.
Quy tắc 8B: Mỗi lớp con tương ứng với một quan hệ. Với mỗi lớp con Si
chúng ta tạo một quan hệ Li bao gồm các thuộc tính của lớp Si cộng với các
thuộc tính của lớp C. Khóa chính của quan hệ Li là k. Quy tắc này chỉ áp
dụng cho kiểu chuyên biệt hóa toàn phần, nghĩa là mọi thực thể trong lớp
cha phải xuất hiện trong ít nhất một lớp con.
Quy tắc 8C: Sử dụng một quan hệ với một thuộc tính phân loại. Chúng ta
tạo duy nhất một quan hệ L bao gồm tất cả thuộc tính của các lớp C, S1, S2,
…, Sm cộng với một thuộc tính t. Khóa chính của quan hệ L này là k. Thuộc
tính t được gọi là thuộc tính phân loại nhằm xác định bộ đang xét là thực
thể của lớp con tương ứng nào. Quy tắc này chỉ áp dụng cho kiểu chuyên
hóa tách biệt, nghĩa là các lớp con không chồng chéo lên nhau, Ngoài ra áp
dụng quy tắc này có thể phát sinh nhiều giá trị NULL nếu các lớp con có
nhiều thuộc tính.
Quy tắc 8D: Sử dụng một quan hệ với nhiều thuộc tính phân loại. Chúng
ta tạo duy nhất một quan hệ L bao gồm tất cả thuộc tính của các lớp C, S1,
S2, …, Sm cộng với các thuộc tính phân loại {t1, t2, …, tm} ứng với m lớp
con. Khóa chính của quan hệ L này là k. Thuộc tính ti có kiểu Boolean, trả
về kết quả là TRUE nếu bộ đang xét ứng với một thực thể thuộc lớp con Si.
VÍ DỤ 6.10: Ánh xạ mối liên kết cha/con thông qua thuộc tính phân lớp.
Ánh xạ mối liên kết cha/con giữa các lớp SECRETARY, ENGINEER, và
DRIVER với EMPLOYEE thông qua thuộc tính phân lớp JobType
Hình 6.13. Lớp con chung KEY_MAN trong mối liên hệ đa thừa kế.
Lớp con chung này có thể được biểu diễn bởi một quan hệ cùng tên, chứa các
thuộc tính của EMPLOYEE, ENGINEER và FULLTIME (mỗi thuộc tính trùng
nhau chỉ xuất hiện một lần) cùng với các thuộc tính riêng của nó như sau:
KEY_MAN (ESSN, …, EStartdate, EngType, Position)
Như vậy, với tất cả các quy tắc đã nêu ở trên, chúng ta có thể xây dựng một lược
đồ CSDL quan hệ từ mô hình thực thể kết hợp (mở rộng). Lược đồ CSDL ứng với
bài toán mẫu được trình bày ở mục 2.2 được trình bày trong hình vẽ sau đây.
DEPENDENT
DName
ESSN
DSex
DBirthdate
DRelationship
Hình 6.14. Lược đồ cơ sở dữ liệu COMPANY ứng với mô hình ở hình 6.3.
DEPENDENT Qualification
DName Experienced
Hình 6.15. Lược đồ cơ sở dữ liệu COMPANY ứng với mô hình ở hình 6.4.
Chúng ta đã tìm hiểu các bước thiết kế mô hình thực thể kết hợp (mở rộng) ở mức
trừu tượng cao từ bản đặc tả yêu cầu dữ liệu của người sử dụng. Sau đó, chúng ta
nghiên cứu quy trình gồm bảy bước để chuyển đổi mô hình thực thể kết hợp sang
lược đồ cơ sở dữ liệu. Cuối cùng, chúng ta hoàn chỉnh lược đồ cơ sở dữ liệu với
các tinh chỉnh phù hợp với các vấn đề có liên quan đến sự phân cấp của dữ liệu
(mô hình thực thể kết hợp mở rộng).
Tóm lại, kết thúc chương này, người đọc đã được trang bị đầy đủ kiến thức và sẵn
sàng thực hiện nhiệm vụ thiết kế cơ sở dữ liệu quan hệ ứng dụng cho các hệ thống
thông tin từ những bản đặc tả yêu cầu người sử dụng có sẵn.
7
NGÔN NGỮ TRUY VẤN
CÓ CẤU TRÚC
Mục tiêu
Chương này cung cấp cho người đọc các kiến thức từ cơ bản đến nâng cao về
ngôn ngữ dữ liệu phổ biến nhất trên thị trường hiện nay, ngôn ngữ được sử dụng
làm nền tảng cho mọi hệ quản trị cơ sở dữ liệu quan hệ. Đó là ngôn ngữ truy vấn
có cấu trúc.
Nội dung
Định nghĩa dữ liệu và các kiểu dữ liệu
Các ràng buộc cơ bản trong SQL
Các câu lệnh thay đổi lược đồ cơ sở dữ liệu
Các truy vấn cơ bản trong SQL
Các câu truy vấn phức tạp
Các lệnh cập nhật dữ liệu trong SQL
Trong chương này, chúng tôi trình bày các đặc trưng chính của ngôn ngữ SQL
chuẩn được dùng trong các RDBMS thương mại hóa, vốn được xây dựng trên nền
tảng mô hình dữ liệu quan hệ. SQL được chính thức công nhận theo chuẩn ANSI(1)
và ISO(2) từ năm 1986. Trải qua nhiều phiên bản kế tiếp, SQL ngày càng hoàn
thiện, hỗ trợ nhiều chức năng giúp xây dựng và quản trị cơ sở dữ liệu một cách
nhanh chóng, hiệu quả, và an toàn.
Ngoài khái niệm về lược đồ, SQL2 còn sử dụng khái niệm danh mục như là bộ
sưu tập các lược đồ cơ sở dữ liệu trong môi trường SQL. Danh mục SQL chứa
lược đồ SQL đặc biệt có tên INFORMATION_SCHEMA để lưu giữ thông tin về
các lược đồ có trong danh mục và tất cả mô tả có trong các lược đồ này. Các ràng
buộc toàn vẹn như là ràng buộc tham chiếu chỉ có thể được định nghĩa giữa các
bảng trong cùng một danh mục. Ngoài ra, một số thành phần nào đó trong lược đồ
này (ví dụ như định nghĩa miền giá trị) có thể được sử dụng lại trong lược đồ khác,
với điều kiện các lược đồ này nằm trong cùng một danh mục.
Các quan hệ được định nghĩa bằng lệnh CREATE TABLE được gọi là các bảng
cơ sở (quan hệ cơ sở), nghĩa là quan hệ và các bộ của nó được tạo ra và lưu trữ vật
lý trong tệp tin dữ liệu của DBMS. Đối lập với quan hệ cơ sở là quan hệ ảo được
tạo thông qua câu lệnh CREATE VIEW, kết quả tạo ra và các dữ liệu của nó
không được lưu trữ vật lý trong DBMS. Trong SQL các thuộc tính của bảng cơ sở
được xem là có trật tự, ứng với trật tự khi định nghĩa các thuộc tính đó trong câu
Hình 7.1. Các câu lệnh định nghĩa lược đồ cơ sở dữ liệu COMPANY
7.1.3 Các kiểu dữ liệu và miền giá trị của thuộc tính
Các kiểu dữ liệu cơ bản được sử dụng trong SQL bao gồm kiểu dữ liệu số, kiểu dữ
liệu chuỗi ký tự, kiểu dữ liệu chuỗi bit, kiểu Boolean, kiểu dữ liệu ngày giờ. Cụ
thể như sau:
Kiểu dữ liệu số bao gồm các kiểu số nguyên với kích thước khác nhau
(INTEGER hay INT, và SMALLINT), các kiểu dữ liệu dấu chấm động
(FLOAT hay REAL, và DOUBLE PRECISION). Ngoài ra còn có các kiểu
số thập phân DECIMAL(i,j), với i số chữ số trong phần nguyên, và j là số
chữ số phần thập phân.
Kiểu dữ liệu chuỗi ký tự bao gồm các kiểu dữ liệu có chiều dài cố định như
là CHAR(n) hay CHARACTER(n), với n là số ký tự trong chuỗi. Ngoài ra,
Trong khi định nghĩa các bảng dữ liệu bằng lệnh CREATE TABLE, chúng ta có
thể sẽ dùng đi dùng lại nhiều lần cùng một kiểu dữ liệu cho các thuộc tính ở các
bảng khác nhau. Để câu lệnh CREATE TABLE của chúng ta đơn giản và dễ hiểu
hơn, chúng ta định nghĩa sẵn một miền giá trị, và sử dụng miền giá trị này tại các
khai báo thuộc tính phù hợp.
VÍ DỤ 7.2: Định nghĩa miền giá trị bằng lệnh CREATE DOMAIN.
Chúng ta có thể định nghĩa miền giá trị SSN_TYPE như sau:
CREATE DOMAIN SSN_TYPE AS DECIMAL(18,0)
Tiếp theo, chúng ta sử dụng SSN_TYPE thay thế cho DECIMAL(18,0) trong hình
7.1 đối với các thuộc tính ESSN, supervisorSSN của EMPLOYEE, mgrSSN của
DEPARTMENT, ESSN của WORKSON, và ESSN trong DEPENDENT. Cụ thể
chúng ta có thể tạo bảng DEPARTMENT bằng câu lệnh sau đây:
CREATE TABLE DEPARTMENT(
DNumber int ,
DName nvarchar(50),
mgrSSN SSN_TYPE,
mgrStartdate datetime
)
VÍ DỤ 7.3: Khai báo ràng buộc NOT NULL trong lệnh tạo bảng.
Câu lệnh tạo bảng DEPARTMENT với các ràng buộc toàn vẹn NOT NULL như
sau:
CREATE TABLE DEPARTMENT(
DNumber int NOT NULL,
DName nvarchar(50) NOT NULL,
mgrSSN decimal(18, 0),
mgrStartdate datetime
)
Với định nghĩa này, trong quá trình thêm phòng ban mới vào bảng, chúng ta bắt
buộc phải cung cấp giá trị tại các thuộc tính DNumber và DName.Trong trường
hợp một trong hai giá trị này là NULL, ràng buộc NOT NULL bị vi phạm, kết quả
là hệ quản trị CSDL sẽ thông báo lỗi và từ chối thực hiện thao tác này.
Hơn nữa, chúng ta còn có thể khai báo giá trị mặc định cho các thuộc tính bằng
cách sử dụng từ khóa DEFAULT <giá trị mặc định> trong định nghĩa thuộc tính.
Ví dụ 7.4 minh họa cách khai báo giá trị mặc định cho một thuộc tính trong câu
lệnh tạo bảng dữ liệu.
VÍ DỤ 7.4: Khai báo giá trị mặc định trong lệnh tạo bảng.
Giả sử trong lệnh tạo bảng EMPLOYEE , thuộc tính ESalary được cài đặt có giá
trị mặc định là 35,000 như câu lệnh sau đây:
CREATE TABLE EMPLOYEE(
Email: namth@buh.edu.vn 169
ESSN decimal(18, 0),
EName nvarchar(50),
ESalary decimal(18, 0) DEFAULT 35000,
ESex char(1),
…
)
Với định nghĩa này, trong quá trình thêm nhân viên mới vào bảng, nếu chúng ta
không cung cấp giá trị cho thuộc tính ESalary , nhân viên này sẽ nhận giá trị lương
là 35,000, đúng như giá trị mặc định mà chúng ta khai báo ban đầu. Rõ ràng, nếu
thuộc tính không được khai báo giá trị mặc định một cách tường minh, thì giá trị
mặc định mà thuộc tính này nhận được là NULL (trong trường hợp không có ràng
buộc NOT NULL).
Một loại ràng buộc toàn vẹn khác liên quan đến miền giá trị của thuộc tính đó là
ràng buộc toàn vẹn miền giá trị sử dụng từ khóa CHECK theo sau khai báo thuộc
tính.
VÍ DỤ 7.5: Khai báo ràng buộc miền giá trị trong lệnh tạo bảng.
Để thể hiện ràng buộc miền giá trị đối với thuộc tính ESex trong bảng
EMPLOYEE chúng ta sử dụng câu lệnh tạo bảng như sau:
CREATE TABLE EMPLOYEE(
ESSN decimal(18, 0),
EName nvarchar(50),
ESalary decimal(18, 0),
ESex char(1) check (empSex in ('F','M')),
…
)
Trong trường hợp này, chúng ta quy ước ‘F’ là viết tắt của female tức là giới tính
nữ, còn ‘M’ là viết tắt của male tức là giới tính nam.
Để định nghĩa khóa chính (phụ), chúng ta sử dụng mệnh đề PRIMARY KEY
(UNIQUE) trong câu lệnh định nghĩa cấu trúc bảng dữ liệu. Có hai cách để định
nghĩa khóa chính trong quan hệ:
Mệnh đề PRIMARY KEY (UNIQUE) đặt ngay sau thuộc tính khóa chính
của quan hệ.
Mệnh đề PRIMARY KEY (UNIQUE) đặt sau phần khai báo tất cả các
thuộc tính của quan hệ.
Ràng buộc toàn vẹn tham chiếu được thể hiện thông qua mệnh đề FOREIGN KEY
trong câu lệnh tạo bảng. Như đã trình bày ở mục 4.2.4, ràng buộc toàn vẹn tham
chiếu có thể bị vi phạm khi thực hiện các thao tác xử lý dữ liệu (thêm, xóa), hoặc
khi sửa các giá trị thuộc tính khóa chính, khóa ngoại. Khi một thao tác làm cho
ràng buộc toàn vẹn tham chiếu bị vi phạm, SQL mặc định sẽ hủy bỏ việc thực hiện
thao tác đó. Tuy nhiên, chúng ta có thể tự mình ghi nhận và có những hình thức xử
lý trong trường hợp ràng buộc bị vi phạm, bằng cách sử dụng mệnh đề
REFERENTIAL TRIGGERD ACTION. Các hình thức xử lý có thể là đưa về giá
trị NULL (SET NULL), xóa tất cả các bộ có liên quan (CASCADE), hoặc đưa về
giá trị mặc định (SET DEFAULT). Hình 6.6 và hình 6.7 dưới đây minh họa cho
việc khai báo khóa chính và khóa ngoại trong định nghĩa lược đồ cơ sở dữ liệu
COMPANY.
VÍ DỤ 7.6: Khai báo khóa chính, khóa phụ trong lệnh tạo bảng.
Các câu lệnh định nghĩa bảng dữ liệu cho COMPANY với các khai báo khóa
chính, khóa phụ cho từng bảng dữ liệu:
VÍ DỤ 7.8: Đặt tên cho ràng buộc toàn vẹn trong lệnh tạo bảng.
Câu lệnh sau đây định nghĩa bảng PROJECT, kèm theo khai báo ràng buộc toàn
vẹn khóa phụ trên thuộc tính PName:
CREATE TABLE PROJECT(
PNumber int PRIMARY KEY,
PName nvarchar(50),
PLocation nvarchar(50),
DNum int REFERENCES DEPARTMENT(DNumber)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT UK_PName UNIQUE (PName)
)
7.2.4 Khai báo ràng buộc toàn vẹn trên bộ sử dụng CHECK
Ngoài ràng buộc khóa chính và ràng buộc toàn vẹn tham chiếu, trong bảng dữ liệu
còn có nhiều loại ràng buộc toàn vẹn khác. Các ràng buộc này được khai báo bởi
VÍ DỤ 7.9: Khai báo ràng buộc miền giá trị sử dụng CHECK.
Trong quan hệ EMPLOYEE, thuộc tính EStartdate lưu trữ thông tin về thời điểm
bắt đầu làm việc chính thức của nhân viên, còn thuộc tính EBirthdate ngày sinh
của nhân viên. Rõ ràng để có thể làm việc tại công ty, nhân viên phải trên 18 tuổi
tính tại thời điểm bắt đầu làm việc. Câu lệnh định nghĩa bảng EMPLOYEE với
khai báo ràng buộc toàn vẹn nói trên được viết như sau:
CREATE TABLE EMPLOYEE(
ESSN decimal(18, 0) PRIMARY KEY,
EName nvarchar(50),
ESalary decimal(18, 0),
ESex char(1),
EBirthdate datetime,
EStartdate datetime,
supervisorSSN decimal(18, 0),
CHECK (year(EStartdate) - year(EBirthdate) >= 18)
)
Ở đây, chúng ta sử dụng hàm year() được định nghĩa sẵn trong hầu hết các hệ quản
trị CSDL để trả về giá trị năm của đối số truyền vào.
Trước khi bắt đầu, chúng ta phải hiểu sự khác biệt cơ bản giữa SQL và mô hình dữ
liệu quan hệ được trình bày ở chương 4. SQL cho phép bảng dữ liệu (hay quan hệ)
có nhiều hàng (bộ) trùng nhau. Vì thế, bảng dữ liệu SQL không phải là tập hợp các
bộ, như khái niệm quan hệ trong mô hình dữ liệu quan hệ. Nhiều bảng dữ liệu
SQL được xem như là tập hợp các bộ không trùng nhau nếu như chúng ta khai báo
ràng buộc khóa chính đối với một (số) thuộc tính của bảng đó.
VÍ DỤ 7.15: Truy vấn dữ liệu bằng cấu trúc SELECT – FROM – WHERE.
Cho biết tên và mức lương của (các) nhân viên trong phòng có mã số là 1:
Email: namth@buh.edu.vn 177
Q1: SELECT EName, ESalary
FROM EMPLOYEE
WHERE dNum=1
Câu truy vấn này chỉ liên quan tới một quan hệ là EMPLOYEE được liệt kê trong
mệnh đề FROM. Câu truy vấn chọn trong quan hệ EMPLOYEE các bộ thỏa mãn
điều kiện trong mệnh đề WHERE, sau đó chiếu kết quả nhận được trên các thuộc
tính EName và ESalary. Q0 tương tự với biểu thức đại số quan hệ sau đây, ngoại
trừ việc các bộ trùng nhau sẽ bị triệt tiêu:
Q1: πEName, ESalary σdNum = 1 (EMPLOYEE)
Câu truy vấn Q0 cũng cho kết quả tương tự với phép tính quan hệ sau đây, ngoại
trừ việc nó cho phép xuất hiện các bộ trùng nhau trong phần kết quả truy vấn:
Q1: {t.EName,t.ESalary | t∈EMPLOYEE AND t.dNum=1}
Ở đây, chúng ta có thể hiểu biến bộ t duyệt qua tất cả các bộ trong bảng
EMPLOYEE, và tính giá trị điều kiện trong mệnh đề WHERE. Chỉ những bộ cho
giá trị TRUE mới được hiển thị trong phần kết quả của câu truy vấn.
Qua ví dụ trên, chúng ta nhận thấy rằng câu truy vấn SQL đơn giản với một bảng
dữ liệu trong mệnh đề FROM rất giống với cặp phép toán chọn – chiếu (SELECT
– PROJECT) trong đại số quan hệ. Mệnh đề SELECT xác định các thuộc tính
chiếu, còn mệnh đề WHERE xác định điều kiện chọn. Đặc biệt, trong phần kết quả
của câu lệnh SQL cho phép các bộ trùng lặp nhau nếu không có ràng buộc toàn
vẹn khóa chính hay khóa duy nhất.
VÍ DỤ 7.16: Câu truy vấn sử dụng hai bảng trong mệnh đề FROM.
Cho biết mã số và tên của những dự án do phòng Phần mềm nước ngoài quản lý.
Q2: SELECT PNumber, PName
FROM PROJECT, DEPARTMENT
WHERE DName = N’Phòng Phần mềm nước ngoài ‘
AND DNumber = dNum
Truy vấn Q1 tương tự như chuỗi các phép toán đại số quan hệ SELECT–
PROJECT–JOIN. Trong mệnh đề WHERE của Q1, điều kiện DName = ‘Phòng
Email: namth@buh.edu.vn 178
Phần mềm nước ngoài’ là điều kiện chọn, tương ứng với phép chọn σ trong đại số
quan hệ. Điều kiện DNumber = dNum là điều kiện kết, tương ứng với phép kết
JOIN trong đại số quan hệ
VÍ DỤ 7.17: Câu truy vấn sử dụng ba bảng trong mệnh đề FROM.
Với mỗi dự án tại ‘TP. Hồ Chí Minh’, liệt kê số hiệu dự án, số hiệu đơn vị quản lý
dự án, và tên, mức lương của trưởng đơn vị quản lý dự án.
Q3: SELECT p.PNumber, d.DNumber, e.EName, e.ESalary
FROM PROJECT p, DEPARTMENT d, EMPLOYEE e
WHERE p.DNum = d.DNumber
AND mgrSSN = ESSN
AND PLocation = N'TP. Hồ Chí Minh'
Điều kiện kết DNum = DNumber kết nối dự án với đơn vị quản lý nó, trong khi
điều kiện kết mgrSSN = ESSN kết nối đơn vị quản lý dự án với nhân viên quản lý
đơn vị đó.
7.4.2 Các thuộc tính trùng tên, bí danh
SQL cho phép các thuộc tính có thể có tên trùng nhau miễn là chúng thuộc về
những quan hệ khác nhau. Tuy nhiên, trong trường hợp này, nếu câu truy vấn sử
dụng hai hay nhiều thuộc tính trùng tên, chúng ta phải xác định tên quan hệ kèm
theo tên thuộc tính để tránh sự mập mờ. Chúng ta thực hiện việc này bằng cách
xác định tên quan hệ và tên thuộc tính theo mẫu <tên quan hệ>.<tên thuộc tính>.
Như vậy, tên quan hệ sẽ được lặp lại nhiều lần trong câu truy vấn. Để hạn chế việc
này, chúng ta có thể sử dụng bí danh (alias) hay biến bộ (tuple variable).
VÍ DỤ 7.20: Hiển thị tất cả thông tin của các bảng trong mệnh đề FROM.
Tất cả thông tin về nhân viên làm việc trong đơn vị có mã số là 5.
Q7: SELECT *
FROM EMPLOYEE
WHERE dNum = 5
Tất cả thông tin về nhân viên và về đơn vị có tên Phòng Nghiên cứu mà nhân viên
đó công tác.
Q8: SELECT *
FROM EMPLOYEE, DEPARTMENT
WHERE DName=N’Phòng Nghiên cứu và phát triển’
AND dNum=DNumber
7.4.4 Khái niệm tập hợp trong SQL
Như chúng ta đã biết, SQL xử lý bảng không phải như là một tập hợp – mỗi phần
tử chỉ xuất hiện duy nhất một lần. Các bộ trùng lặp có thể xuất hiện nhiều lần
trong bảng, và trong kết quả của câu lệnh truy vấn. SQL không tự động triệt tiêu
các bộ trùng lặp trong kết quả của câu truy vấn vì những lý do sau:
Loại bỏ các bộ trùng lặp xuất hiện ngẫu nhiên là thao tác tốn kém. Một giải
pháp phù hợp là sắp xếp các bộ rồi mới loại bỏ các bộ trùng lặp.
Người dùng có thể quan tâm đến sự trùng lặp trong kết quả truy vấn.
Các bộ trùng lặp có ý nghĩa đặc biệt quan trọng khi thực hiện các hàm kết
hợp.
Với thuộc tính khóa, bảng trong SQL chính là một tập hợp, khi giá trị thuộc tính
khóa phải là duy nhất. Nếu chúng ta muốn loại bỏ các bộ trùng lặp khỏi kết quả
Ngoài ra, câu truy vấn SQL còn cho phép chúng ta sử dụng các phép tính toán,
như cộng (+), trừ (-), nhân (*), và chia (/) với các giá trị số, hoặc các thuộc tính có
miền giá trị số học.
VÍ DỤ 7.24: Câu truy vấn sử dụng phép toán số học ở mệnh đề SELECT.
Liệt kê các nhân viên làm việc trong dự án ‘ProductC’ với mức lương tăng 10%.
Q15: SELECT EName, 1.1*ESalary AS INCREASED_SAL
FROM EMPLOYEE e, WORKSON w, PROJECT p
WHERE e.ESSN=w.ESSN AND w.PNum=p.PNumber
AND proName=’ProjectC’
Đối với các kiểu dữ liệu chuỗi, toán tử kết hợp || có thể được dùng để nối hai chuỗi
lại với nhau. Ngoài các toán tử nói trên, chúng ta còn có thể dùng phép toán
BETWEEN trong mệnh đề WHERE như trong ví dụ 7.25 sau đây.
7.5.1 Các phép so sánh liên quan tới giá trị NULL
SQL có nhiều quy tắc để xử lý giá trị NULL. Giá trị NULL có các ý nghĩa sau đây:
Unknown value (giá trị chưa biết): mỗi người đều có ngày sinh, nhưng
chúng ta chưa biết ngày sinh của nhân viên Võ Việt Anh, vì thế bộ dữ liệu
của nhân viên này có giá trị NULL tại thuộc tính EBirthdate.
SQL thường sẽ không phân biệt giá trị NULL trong cơ sở dữ liệu có ý nghĩa gì
trong ba ý nghĩa nêu trên. Khi giá trị NULL xuất hiện trong phép so sánh, giá trị
trả về sẽ là UNKNOWN (có thể đúng, hoặc có thể sai). Chính vì vậy, kết quả của
một biểu thức luận lý trong SQL có thể là TRUE, FALSE, hay UNKNOWN. SQL
cho phép kiểm tra giá trị thuộc tính là NULL hay không bằng cách sử dụng toán tử
IS NULL, và IS NOT NULL.
7.5.2 Truy vấn lồng, các phép so sánh trên bộ và tập hợp
Nhiều câu truy vấn yêu cầu các giá trị có được sau khi thực hiện truy vấn từ cơ sở
dữ liệu tiếp tục được sử dụng trong mệnh đề so sánh. Những câu truy vấn như thế
này có tên gọi là truy vấn lồng, vì trong mệnh đề WHERE của câu truy vấn này
(câu truy vấn cha) có mệnh đề SELECT của câu truy vấn khác (câu truy vấn con).
Trong trường hợp tổng quát, câu truy vấn con sẽ trả về kết quả là một bảng được
xem như là tập hợp gồm nhiều bộ dữ liệu, vì thế, phép toán so sánh đi kèm với nó
là những phép toán so sánh một giá trị đơn (hoặc một bộ gồm nhiều giá trị đơn)
với một tập hợp nhiều giá trị đơn (hoặc nhiều bộ). Nếu câu truy vấn con trả về một
Email: namth@buh.edu.vn 186
thuộc tính và một bộ duy nhất, kết quả này được xem như là một giá trị đơn.
Trong trường hợp này, thay vì dùng phép toán so sánh giá trị đơn với tập hợp
nhiều giá trị (IN, NOT IN, …), chúng ta có thể dùng toán tử so sánh một giá trị
với một giá trị khác (=, ≥, ≤, …).
Ngoài toán tử IN, chúng ta còn thể sử dụng nhiều toán tử khác để so sánh một giá
trị đơn v (thường là tên thuộc tính) với một tập hợp V gồm nhiều giá trị khác
(thường là một câu truy vấn lồng). Toán tử = ANY (hay = SOME) cho kết quả
TRUE nếu giá trị v bằng với ít nhất một giá trị trong tập hợp V (giống như định
nghĩa của toán tử IN). Nhiều phép so sánh khác cũng có thể kết hợp với từ khóa
ANY, và SOME như là >, >=, <, <=, và <>. Từ khóa ALL cũng có thể kết hợp với
các toán tử này. Ví dụ, mệnh đề điều kiện (v > ALL V) có giá trị là TRUE khi giá
trị v lớn hơn tất cả các giá trị trong tập hợp V.
Một vấn đề cần phải chú ý khi thực hiện các câu truy vấn lồng, đó là trường hợp
các thuộc tính có tên giống nhau xuất hiện nhiều lần trong câu truy vấn lồng. Để
phân biệt chúng, chúng ta sử dụng các bí danh như đã đề cập ở các phần trước.
VÍ DỤ 7.32: Truy vấn lồng có thể được thay thế bởi một truy vấn đơn.
Câu truy vấn Q21 có thể viết lại bằng truy vấn đơn như sau:
Q22: SELECT DISTINCT E.EName
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.ESSN<>E2.ESSN AND E1.EName=E2.EName
7.5.4 Hàm EXISTS trong SQL
Hàm EXISTS trong SQL được dùng để kiểm tra kết quả của câu truy vấn lồng
tương quan có rỗng hay không. Với Q là kết quả của một câu truy vấn,
EXISTS(Q) cho ra giá trị TRUE nếu Q chứa ít nhất một bộ, ngược lại sẽ cho ra giá
trị FALSE.
VÍ DỤ 7.32: Sử dụng EXISTS trong câu truy vấn lồng tương quan.
Câu truy vấn Q21 có thể viết lại với hàm EXISTS như sau:
Q23: SELECT E.*
FROM EMPLOYEE E
WHERE EXISTS (SELECT *
FROM EMPLOYEE
WHERE E.EName=EName
AND E.ESSN <> ESSN)
Trong Q23, câu truy vấn con tham chiếu tới các thuộc tính ESSN và EName của
quan hệ EMPLOYEE từ câu truy vấn cha. Chúng ta có thể nghĩ Q23 như sau:
Với mỗi bộ nhân viên E trong EMPLOYEE, tính toán tất cả các bộ trong quan hệ
EMPLOYEE thỏa mãn điều kiện trùng tên với E nhưng không phải E. Nếu tồn tại
ít nhất một bộ trong quan hệ EMPLOYEE thỏa mãn các điều kiện trên, thì nhân
viên E được chọn xuất hiện trong kết quả trả về của câu truy vấn cha.
VÍ DỤ 7.34: Câu truy vấn với các giá trị cụ thể được khai báo tường minh.
Cho biết mã số nhân viên làm việc trong các dự án có mã số lần lượt 1, 2, và 3.
Q25: SELECT DISTINCT ESSN
FROM WORKSON
WHERE proNum IN (1,2,3)
Trong SQL, chúng ta có thể đổi tên các thuộc tính xuất hiện trong phần kết quả
của câu truy vấn bằng cách thêm từ khóa AS và tên mới mong muốn vào sau tên
thuộc tính muốn đổi tên. Từ khóa AS được dùng để khai báo bí danh cho cả thuộc
tính và quan hệ, được sử dụng trong mệnh đề SELECT và mệnh đề FROM.
Chú ý rằng bảng kết trong SQL là kết quả của phép kết hai hay nhiều bảng với
nhau. Điều này có nghĩa là kết quả của một phép kết lại tham gia trong một phép
kết khác.
VÍ DỤ 7.38: Câu truy vấn sử dụng nhiều phép kết xuất hiện liên tiếp nhau
Với mỗi dự án tại ‘TP. Hồ Chí Minh’, liệt kê số hiệu dự án, số hiệu đơn vị quản lý
dự án, và tên, ngày sinh của trưởng đơn vị quản lý dự án.
Q29: SELECT PNumber, DNumber, EName, EBirthdate
FROM ((PROJECT JOIN DEPARTMENT ON dNum=DNumber)
JOIN EMPLOYEE ON mgrSSN=ESSN)
WHERE PLocation = N’TP Hồ Chí Minh’
Chú ý:
Mệnh đề SELECT chỉ bao gồm thuộc tính gom nhóm và các hàm kết hợp
được thực hiện cho từng nhóm.
VÍ DỤ 7.43: Mệnh đề gom nhóm với nhiều hơn một thuộc tính.
Với mỗi dự án, cho biết mã số dự án, tên dự án, số nhân viên tham gia dự án đó.
Q34: SELECT p. PNumber, p. PName, COUNT(*)
FROM PROJECT p, WORKSON w
WHERE p.PNumber = w.PNum
GROUP BY p. PNumber, p.Pname
Trong ví dụ trên, chúng ta thực hiện phép gom nhóm sau phép kết giữa hai quan
hệ PROJECT và WORKSON. Nói cách khác, chúng ta đã thực hiện phép gom
nhóm trên các bộ thỏa mãn điều kiện chọn cho trước. Trong trường hợp này, điều
kiện chọn cho trước là điều kiện kết giữa hai quan hệ nói trên. Sau khi thực hiện
phép gom nhóm, chúng ta tiếp tục thực hiện các hàm kết hợp trên tất cả các nhóm
được gom. Tuy nhiên, không phải lúc nào chúng ta cũng được yêu cầu phải thực
hiện các hàm kết hợp trên tất cả các nhóm nhận được sau khi thực hiện phép gom
nhóm.
VÍ DỤ 7.44: Câu truy vấn sử dụng mệnh đề HAVING theo sau GROUP BY.
Với mỗi dự án có nhiều hơn hai nhân viên tham gia, cho biết mã số dự án, tên dự
án, và số nhân viên tham gia dự án đó.
Q35: SELECT p.PNumber, p.PName, COUNT(*)
FROM PROJECT p, WORKSON w
WHERE p.PNumber = w.PNum
GROUP BY p.PNumber, p.PName
HAVING COUNT(*) > 2
Trình tự thực hiện câu truy vấn trong SQL như sau. Đầu tiên, mệnh đề FROM
được thực hiện, SQL tính tích Cartesian của các quan hệ được liệt kê trong mệnh
đề FROM. Sau đó, SQL chọn từ tích Cartesian nói trên các bộ thỏa mãn điều kiện
chọn trong mệnh đề WHERE. Các bộ thỏa mãn điều kiện chọn sẽ được gom thành
nhiều nhóm dựa trên các thuộc tính gom nhóm trong mệnh đề GROUP BY. Tuy
nhiên, chỉ những nhóm thỏa mãn điều kiện trong mệnh đề HAVING mới được
hiển thị như là kết quả của câu truy vấn. Trật tự hiển thị kết quả của câu truy vấn
phụ thuộc vào các thuộc tính sắp xếp trong mệnh đề ORDER BY. Cuối cùng, câu
truy vấn chỉ hiển thị các thuộc tính và kết quả thực hiện các hàm kết hợp được liệt
kê ở mệnh đề SELECT đối với những nhóm được chọn theo trật tự xác định.
VÍ DỤ 7.46: Câu lệnh thêm mới một bộ vào quan hệ.
Câu lệnh sau đây được dùng để thêm một bộ vào quan hệ EMPLOYEE
U2: INSERT INTO EMPLOYEE (ESSN, EName, DNum)
VALUES (‘30121050004’, N‘Mai Duy An’,1)
Các thuộc tính không được thể hiện tường minh trong U2 sẽ nhận giá trị
DEFAULT hoặc NULL, và các giá trị được liệt kê đúng theo trật tự mà các thuộc
tính tương ứng xuất hiện trong câu lệnh INSERT.
Chú ý rằng thao tác thêm một bộ vào quan hệ có thể dẫn đến vi phạm ràng buộc
toàn vẹn tham chiếu. Ví dụ, khi thêm một bộ vào quan hệ EMPLOYEE với giá trị
tại thuộc tính DNum là 7, trong khi đó quan hệ DEPARTMENT không có bộ nào
có giá trị là 7 tại thuộc tính DNumber. Như chúng ta đã biết, giữa quan hệ
EMPLOYEE và quan hệ DEPARTMENT có một ràng buộc toàn vẹn tham chiếu
từ DNum của EMPLOYEE đến DNumber của DEPARTMENT. Như vậy, thao
tác thêm bộ mới nói trên đã vi phạm ràng buộc toàn vẹn tham chiếu này.
VÍ DỤ 7.50: Câu lệnh cập nhật giá trị của một (số) bộ thỏa mãn điều kiện.
Để thay đổi địa điểm và đơn vị quản lý của dự án có mã số là 10 với các giá trị
mới lần lượt là ‘Hà Nội’ và 5, chúng ta sử dụng câu lệnh sau đây:
U5: UPDATE PROJECT
SET PLocation = N’Hà Nội’, DNum=5
WHERE PNumber = 10
Trong U5, chúng ta chỉ thay đổi giá trị của một bộ trong quan hệ PROJECT.
Lệnh UPDATE có thể thay đổi cùng lúc nhiều bộ, nếu các bộ này thỏa mãn điều
kiện trong mệnh đề WHERE.
VÍ DỤ 7.50: Truy vấn lồng xuất hiện trong mệnh đề WHERE của câu lệnh
cập nhật một (số) bộ trong quan hệ.
Để tăng lương cho mọi nhân viên của phòng Nghiên cứu lên 10% lương hiện tại,
chúng ta sử dụng lệnh UPDATE sau đây:
U6: UPDATE EMPLOYEE
SET ESalary = ESalary *1.1
Tiếp theo, chúng ta nghiên cứu cách thức thực hiện các câu truy vấn dữ liệu với từ
khóa duy nhất SELECT. Chúng ta tiến hành từ câu truy vấn đơn giản tới các dạng
phức tạp như là cấu trúc lồng vào nhau, cấu trúc gom nhóm với việc sử dụng các
hàm kết hợp, cấu trúc kết trong và kết ngoài.
Cuối cùng, chúng ta tìm hiểu các lệnh xử lý dữ liệu (DML) như để hoàn chỉnh nội
dung kiến thức về ngôn ngữ truy vấn có cấu trúc. Với ba lệnh chèn, sửa, và xóa,
chúng ta có thể thay đổi nội dung của bảng dữ liệu bất kỳ lúc nào, miễn sao sự
thay đổi đó không gây ra vi phạm đối với các ràng buộc toàn vẹn có liên quan đã
được định nghĩa trước đó.
8
LÝ THUYẾT THIẾT KẾ
CƠ SỞ DỮ LIỆU QUAN HỆ
Mục tiêu
Chương này trang bị cho người đọc kiến thức về các tiêu chuẩn thiết kế CSDL
quan hệ, giúp người đọc khắc phục được những thiếu sót thường gặp trong quá
trình thiết kế CSDL, giảm thiểu rủi ro, kéo dài thời gian sử dụng của CSDL, đáp
ứng tốt nhu cầu thông tin của người sử dụng dựa trên CSDL được thiết kế.
Nội dung
Phụ thuộc hàm.
Hệ tiên đề các phụ thuộc hàm.
Một số vấn đề khi thiết kế cơ sở dữ liệu quan hệ.
Phân tách dữ liệu.
Các dạng chuẩn của mô hình dữ liệu quan hệ.
Các phương pháp chuẩn hóa cơ sở dữ liệu quan hệ.
Các vấn đề nêu trên đều có thể được giải quyết một cách triệt để, nếu chúng ta
tuân thủ theo một lý thuyết được phát triển riêng cho cơ sở dữ liệu quan hệ: lý
thuyết phụ thuộc hàm. Tuân thủ các nguyên tắc do lý thuyết này đề ra, chúng ta sẽ
xây dựng được một cơ sở dữ liệu tốt, hoạt động hiệu quả, đảm bảo các yêu cầu
truy xuất và cập nhật.
Nếu hai bộ của quan hệ R có giá trị giống nhau tại các thuộc tính A1,
A2, ..., An, thì chúng cũng phải có giá trị giống nhau tại các thuộc tính
B1, B2, ..., Bm.
Phụ thuộc hàm f trên được ký hiệu là A1,A2,...,An → B1,B2,...,Bm, và đọc là A1, A2,
..., An xác định hàm B1, B2, ..., Bm.
Hình 8.1 diễn tả tác động của phụ thuộc hàm f đối với hai bộ t và u bất kỳ của
quan hệ R. Tuy nhiên, vị trí của các thuộc tính Ai, Bi là bất kỳ, chúng không nhất
thiết phải kế tiếp nhau, hoặc các thuộc tính Ai bắt buộc phải đứng trước các thuộc
tính Bi.
Hình 8.1. Ảnh hưởng của phụ thuộc hàm đối với hai bộ t, u bất kỳ.
Email: namth@buh.edu.vn 208
Chúng ta có thể phát biểu lại định nghĩa phụ thuộc hàm f trên quan hệ R giữa hai
tập các thuộc tính X và Y như sau:
Cho R là quan hệ trên tập thuộc tính Ω, với X và Y là hai tập con (khác
rỗng) bất kỳ của Ω. Nói rằng X xác định Y, hay Y phụ thuộc hàm vào X,
ký hiệu X → Y, khi và chỉ khi ∀r,s ∈ R, nếu r[X] = s[X], thì r[Y] = s[Y].
Quan hệ R được gọi là thỏa mãn phụ thuộc hàm f, nếu f đúng với mọi thể hiện của
quan hệ R, và khi đó, chúng ta đã xác nhận một ràng buộc trên quan hệ này.
VÍ DỤ 8.1: Sự tồn tại của các phụ thuộc hàm trong quan hệ.
Xét quan hệ PROJECT1 với lược đồ như sau:
PROJECT1(PName, PLocation, DName, EName, workHours)
Quan hệ PROJECT1 bao gồm thông tin của cả ba quan hệ DEPARTMENT,
EMPLOYEE, và WORKSON. Dễ dàng thấy rằng trong quan hệ này tồn tại phụ
thuộc hàm PName → PLocation DName. Phụ thuộc hàm này nói rằng nếu hai bộ
có cùng giá trị tại thành phần PName thì chúng cũng có cùng giá trị tại các thành
phần PLocation và DName. Sự tồn tại của phụ thuộc hàm này hoàn toàn hợp lý, vì
chúng ta tin rằng một dự án không thể được thực hiện tại hai thành phố khác nhau,
cũng không thể chịu sự quản lý của hai đơn vị khác nhau. Trong khi đó, PName →
EName workHours lại không thể là phụ thuộc hàm trên PROJECT1, bởi vì một
dự án có thể có nhiều nhân viên tham gia với một khối lượng thời gian cụ thể.
Một thể hiện của quan hệ PROJECT1 được biểu diễn trong hình 8.2.
8.1.2 Khóa của quan hệ
Chúng ta nói tập hợp của một (hoặc nhiều) thuộc tính {A1, A2, ..., An} là khóa của
quan hệ R nếu thỏa mãn đồng thời hai điều kiện sau đây:
1) Các thuộc tính đó xác định tất cả các thuộc tính khác của quan hệ.
2) {A1, A2, ..., An} không có bất kỳ tập con khác rỗng nào có thể xác định tất
cả các thuộc tính khác của quan hệ. Khóa phải là nhỏ nhất.
Chúng ta bắt đầu với một ví dụ minh họa cách suy luận một phụ thuộc hàm từ các
phụ thuộc hàm cho trước.
Tiếp theo chúng ta sẽ tìm hiểu một số quy luật biến đổi liên quan tới phụ thuộc
hàm. Các quy luật này cho phép chúng ta thay thế tập hợp các phụ thuộc hàm này
bằng tập hợp các phụ thuộc hàm khác tương đương. Ngoài ra, chúng ta cũng làm
quen với thuật toán kiểm chứng một phụ thuộc hàm có được dẫn xuất từ một (số)
phụ thuộc hàm khác hay không.
Việc phân tách một phụ thuộc hàm thành nhiều phụ thuộc hàm khác tương đương
với phụ thuộc hàm ban đầu, hoặc việc kết hợp nhiều phụ thuộc hàm thành một phụ
thuộc hàm duy nhất tương đương là điều cần thiết, và được trình bày trong định
nghĩa sau đây.
Với phụ thuộc hàm f: A1A2...An → B1B2...Bm và tập phụ thuộc hàm f1: A1A2...An →
B1,…, fm: A1A2...An → Bm, chúng ta định nghĩa quá trình phân tách f thành f1, f2, …,
fm và kết hợp các phụ thuộc hàm f1, f2, …, fm thành f bằng hai quy luật sau đây:
Chúng ta có thể thay thế phụ thuộc hàm A1A2...An → B1B2...Bm bằng tập hợp
m phụ thuộc hàm A1A2...An → Bi, với i=1,2,...,m. Chúng ta gọi sự biến đổi
này là quy luật phân tách.
Chúng ta có thể thay thế tập hợp các phụ thuộc hàm A1A2...An → Bi, với
i=1,2,...,m, bằng một phụ thuộc hàm duy nhất A1A2...An → B1B2...Bm. Sự
biến đổi này được gọi là quy luật kết hợp.
VÍ DỤ 8.5: Quy luật phân tách/kết hợp các phụ thuộc hàm.
Tập phụ thuộc hàm của quan hệ PROJECT trong ví dụ 8.2:
PName → PLocation
Với quy luật kết hợp, chúng ta cũng chứng minh tương tự. Giả sử quan hệ R có hai
bộ có giá trị bằng nhau tại các thuộc tính A1, A2, ... , An, và tồn tại các phụ thuộc
hàm A1A2...An → Bi, với i=1,2,...,m. Do đó, hai bộ nói trên cũng có giá trị bằng
nhau lần lượt tại các thuộc tính B1, B2, ... ,Bm tương ứng với mỗi phụ thuộc hàm
nói trên. Như vậy trên quan hệ R tồn tại phụ thuộc hàm A1A2...An → B1B2...Bm, và
có thể thay thế m phụ thuộc hàm ban đầu bằng phụ thuộc hàm này (quy luật kết
hợp).
Chúng ta cần chú ý quy luật phân tách và kết hợp chỉ có ảnh hưởng đến vế phải
của các phụ thuộc hàm. Điều này có nghĩa là không có quy luật phân tách đối với
vế trái của phụ thuộc hàm, như ví dụ sau đây.
Từ khái niệm phụ thuộc hàm hiển nhiên, chúng ta có thể định nghĩa một dạng phụ
thuộc hàm không hiển nhiên, nhưng có thể suy diễn dễ dàng từ các phụ thuộc hàm
hiển nhiên bằng cách loại bỏ ra khỏi vế phải những thuộc tính xuất hiện trong vế
trái của phụ thuộc hàm đó:
Phụ thuộc hàm A1A2...An → B1B2...Bm tương đương với phụ thuộc hàm
A1A2...An → C1C2...Ck, với Ci ∈ {B1, B2, ..., Bm} \ {A1, A2, ... ,An}.
Chúng ta gọi phép biến đổi này là quy luật phụ thuộc hiển nhiên.
Để tính bao đóng X của tập hợp A các thuộc tính, chúng ta bắt đầu từ tập hợp X =
A, và liên tục mở rộng tập hợp này bằng cách xem xét các phụ thuộc hàm trong ℑ.
Trong trường hợp phụ thuộc hàm Si có các thuộc tính ở vế trái nằm trong tập X, và
thuộc tính ở vế phải chưa xuất hiện trong X, thì chúng ta bổ sung thuộc tính này
vào tập X. Dĩ nhiên, quá trình này không thể diễn ra mãi mãi, và tập hợp X cuối
cùng chính là bao đóng của {A1, A2, ..., An}. Quá trình này được thể hiện chi tiết
thành thuật toán 8.1 dưới đây.
THUẬT TOÁN 8.1: Bao đóng của tập các thuộc tính.
Đầu vào: Tập các thuộc tính {A1, A2, ..., An} và tập các phụ thuộc hàm ℑ.
Đầu ra: Bao đóng {A1, A2, ..., An}+.
1. Phân tách các phụ thuộc hàm trong ℑ, sao cho mỗi phụ thuộc hàm trong ℑ
chỉ có một thuộc tính ở vế phải.
2. Gọi X là tập hợp bao đóng các thuộc tính. Tại thời điểm khởi tạo X = {A1,
A2, ..., An}.
3. Tìm một phụ thuộc hàm B1B2...Bm→C, sao cho tất cả B1, B2, ..., Bm đều nằm
trong X, nhưng C thì không. Thêm C vào tập X, và lặp lại bước 3.
Vì số phần tử trong X chỉ có thể tăng, và số thuộc tính của bất kỳ lược đồ
cơ sở dữ liệu nào cũng có giới hạn, cho nên sẽ xảy ra trường hợp không thể
thêm thuộc tính mới vào X, và thuật toán kết thúc.
Tập hợp X, sau khi không thể thêm thuộc tính mới vào, là bao đóng của tập thuộc
tính ban đầu.
Với thuật toán tính bao đóng của các thuộc tính, chúng ta có thể kiểm tra một phụ
thuộc hàm A1A2...An → B có được dẫn xuất từ tập phụ thuộc hàm ℑ hay không.
Đầu tiên, chúng ta tính {A1, A2, ..., An}+ theo các phụ thuộc hàm trong ℑ. Nếu B
VÍ DỤ 8.8: Áp dụng thuật toán tìm bao đóng các thuộc tính.
Xét quan hệ R(A,B,C,D,E,F) với các phụ thuộc hàm AB → C, BC → AD, D → E,
và CF → B. Tìm bao đóng của {A, B}.
Trước hết, chúng ta phân tách phụ thuộc hàm BC→AD thành hai phụ thuộc hàm
tương đương là BC→A và BC→D. Chúng ta bắt đầu thuật toán với X={A, B}:
Áp dụng phụ thuộc hàm AB → C, với A, B ∈ X, và C ∉ X, thêm C vào X.
Sau bước này, X={A, B, C}.
Áp dụng phụ thuộc hàm BC → A, và BC → D với B, C ∈ X. Do A ∈ X, và
D ∉ X, nên thêm D vào X. Đến đây, X={A, B, C, D}.
Áp dụng D → E với D ∈ X, và E ∉ X, thêm E vào X. Lúc này, X={A, B, C,
D, E}.
Tập hợp X={A, B, C, D, E} không thể tiếp tục thay đổi, do các phụ thuộc hàm
hoặc đã được áp dụng, hoặc không thể áp dụng, do không dẫn xuất được từ tập
hợp X. Vì vậy X+ = {A, B}+ = {A, B, C, D, E}.
VÍ DỤ 8.9: Áp dụng thuật toán 8.1 kiểm tra sự tồn tại của phụ thuộc hàm.
Xét quan hệ R và tập phụ thuộc hàm trong ví dụ 8.8. Để kiểm tra AB→D có được
dẫn xuất từ các phụ thuộc hàm này hay không, chúng ta tính bao đóng
{A,B}+={A,B,C,D,E}. Vì D∈{A, B}+, nên AB→D được dẫn xuất từ tập phụ thuộc
hàm ban đầu. Ngoài ra, để kiểm tra D→A có tồn tại hay không, chúng ta tính {D}+
Để chứng minh quy luật bắc cầu, chúng ta cần tính bao đóng {A1, A2, ..., An}+, và
kiểm tra xem C1, C2, ..., Ck có nằm trong bao đóng này hay không. Phụ thuộc hàm
A1A2...An → B1B2...Bm cho chúng ta biết rằng B1, B2, ..., Bm nằm trong {A1, A2, ...,
An}+. Sau đó, chúng ta áp dụng phụ thuộc hàm B1B2...Bm → C1C2...Ck, và thêm C1,
C2, ..., Ck vào {A1, A2, ..., An}+. Vì tất cả Ci đều nằm trong {A1, A2, ..., An}+, nên
chúng ta kết luận rằng A1A2...An → C1C2...Ck đúng với mọi quan hệ thỏa mãn đồng
thời A1A2...An → B1B2...Bm và B1B2...Bm → C1C2...Ck.
VÍ DỤ 8.11: Cơ sở tối thiểu của một tập các phụ thuộc hàm.
Xét quan hệ R(A, B, C) sao cho mỗi thuộc tính xác định hàm hai thuộc tính còn lại.
Do đó, tập phụ thuộc hàm đầy đủ của R bao gồm các phụ thuộc hàm không hiển
nhiên A→B, A→C, B→A, B→C, C→A, C→B, AB→C, AC→B, BC→A, và các
phụ thuộc hàm hiển nhiên A→A, B→B, và C→C.
Quan hệ R và tập phụ thuộc hàm của nó có nhiều cơ sở tối thiểu, hai trong số đó là
{ A → B, B → A, B → C, C → B} và { A → B, B → C, C → A }
Để xác định những phụ thuộc hàm tồn tại trên R1, chúng ta phải thực hiện chiếu
tập phụ thuộc hàm S. Kết quả của phép chiếu này là tập các phụ thuộc hàm:
Được dẫn xuất từ S, và
Chỉ chứa các thuộc tính của R1.
Quá trình này được thể hiện trong thuật toán 8.2 sau đây.
THUẬT TOÁN 8.2: Phép chiếu tập các phụ thuộc hàm.
Đầu vào: Quan hệ R, tập phụ thuộc hàm S trên R, và quan hệ R1=πL(R).
Đầu ra: Tập phụ thuộc hàm trên R1.
1. Cho T là tập phụ thuộc hàm cần tìm. Ban đầu, T nhận giá trị rỗng.
2. Với mỗi tập con các thuộc tính X của R1, tính X+. Quá trình tính toán này
được thực hiện dựa vào tập phụ thuộc hàm S, và có thể liên quan đến các
thuộc tính trong R nhưng không trong R1. Thêm vào T tất cả phụ thuộc hàm
không hiển nhiên X→A, với A vừa nằm trong X+, vừa nằm trong R1.
3. Lúc này T là cơ sở đối với R1, nhưng không phải là cơ sở tối thiểu. Chúng
ta có thể xây dựng cơ sở tối thiểu từ T như sau:
a. Nếu phụ thuộc hàm f trong T được dẫn xuất từ các phụ thuộc hàm
khác trong T, thì xóa f khỏi T.
b. Cho Y→B là một phụ thuộc hàm trong T, với Y gồm từ hai thuộc tính
trở lên (Y = ZA, A là thuộc tính đơn). Nếu Z → B dẫn xuất từ các phụ
thuộc hàm trong T (bao gồm cả Y→B), thì thay thế Y→B bằng Z→B.
Lặp lại hai bước trên đây cho đến khi nào T không thể thay đổi được nữa.
Vấn đề đặt ra đối với các chuyên gia phân tích và thiết kế CSDL là làm thế nào để
xây dựng được CSDL phản ánh chính xác thực tế, đồng thời phải giải quyết ba vấn
đề cơ bản được nêu ở trên. Trong phần tiếp theo, chúng tôi trình bày một phương
pháp giúp thiết kế được một CSDL tốt: phép phân tách quan hệ.
Phép phân tách Ω = [S1, S2, …, Sk] được gọi là phép phân tách không tổn thất
thông tin của quan hệ R(A1, A2, …, An), nếu:
Khi chúng ta thực hiện phép kết tự nhiên R1 với R2, kết quả nhận được là bốn bộ
thay vì hai bộ như quan hệ R ban đầu:
R3 = R1 ⋈R2 A B C
1 2 3
1 2 5
4 2 3
4 2 5
Từ đó, chúng ta kết luận rằng phép phân tách nêu trên tổn thất thông tin.
8.4.2 Thuật toán kiểm tra phân tách không tổn thất thông tin
Như đã trình bày ở trên, việc phân tách một quan hệ thành nhiều quan hệ chiếu có
thể dẫn đến khả năng tổn thất thông tin khi quan hệ ban đầu không được khôi phục
nguyên vẹn từ phép kết tự nhiên của các quan hệ chiếu nhận được.
Sau đây, chúng tôi giới thiệu một phương pháp đơn giản để kiểm tra phân tách
không tổn thất thông tin. Phương pháp này sử dùng tập phụ thuộc hàm để kiểm tra
xem bộ t bất kỳ của πS1(R)⋈πS2(R)⋈... ⋈πSk(R) có thuộc R hay không. Nếu t là
một bộ trong πS1(R)⋈ πS2(R)⋈... ⋈πSk(R), thì trong R phải tồn tại các bộ t1, t2,..., tk
sao cho ti là kết quả của phép chiếu t trên tập thuộc tính Si. Chúng ta cũng biết
rằng ti giống t tại các thuộc tính của Si, đồng thời, ti không xác định giá trị tại các
thuộc tính khác của R – Si.
Để thực hiện thao tác kiểm tra tách không mất thông tin, chúng ta tạo một bảng
đối chiếu T. Giả sử quan hệ R có các thuộc tính A, B, C, ... và các thành phần của t
lần lượt là a, b, c, .... Với mỗi ti, chúng ta ký hiệu các thành phần của ti ứng với các
thuộc tính trong Si giống như t, các thành phần khác của ti được đánh dấu chỉ mục
duy nhất trong T. Nếu R có n thuộc tính, và phép phân tách tạo ra m quan hệ mới,
thì bảng đối chiếu T sẽ có đúng n cột và m hàng (không kể hàng tiêu đề chứa tên
các thuộc tính).
Trong bảng đối chiếu, mỗi hàng tương ứng với một quan hệ có được sau khi phân
tách. Giá trị thành phần trong từng hàng tùy thuộc vào tập thuộc tính tương ứng
với quan hệ được đại diện bởi hàng đó. Hàng đầu tiên tương ứng với quan hệ có
tập thuộc tính là S1 gồm hai thuộc tính A và D. Do đó giá trị tại hai thuộc tính này
được biểu diễn bởi hai ký tự a và d (không có chỉ số). Trong khi đó, B và C không
nằm trong S1, giá trị tương ứng với các thuộc tính này được biểu diễn bởi b1 và c1
(có chỉ số). Với cách thể hiện này, chúng ta dễ dàng nhận thấy bộ (a,b1,c1,d) thuộc
R1 là kết quả của phép chiếu bộ (a,b,c,d) thuộc R vào tập thuộc tính S1={A,D}.
Cùng phép chiếu này, các thành phần B và C bị loại bỏ khỏi quan hệ R1, nên từ bộ
t1 của quan hệ R1, chúng ta không có bất kỳ thông tin gì về giá trị của hai thành
phần này trong bộ t thuộc quan hệ R đang xét.
Tương tự, hàng thứ hai có các giá trị không có chỉ số dưới tại các thuộc tính A và
C, đồng thời chỉ số dưới 2 được dùng cho các thuộc tính khác. Hàng thứ ba không
đánh dấu chỉ số dưới tại các thuộc tính B, C, và D, trong khi chỉ số dưới 4 được
dùng cho thuộc tính A.
Cuối cùng, do hàng thứ nhất và hàng thứ ba có giá trị bằng nhau tại các thuộc tính
C và D, cho nên phụ thuộc hàm CD→A được áp dụng và a = a3.
Email: namth@buh.edu.vn 229
A B C D
a b1 c d
a b1 c d2
a b c d
Như vậy, sau ba lần áp dụng phụ thuộc hàm, trong bảng đối chiếu xuất hiện bộ
t=(a,b,c,d). Với kết quả này, chúng ta đã chứng được rằng phép phân tách nói trên
không bị mất thông tin.
8.4.3 Phân tách và bảo toàn phụ thuộc hàm
Chúng ta tiến hành phân tách quan hệ R với tập phụ thuộc hàm ℑ thành các quan
hệ R1, R2, ..., Rk với tập thuộc tính lần lượt là S1, S2, ..., Sk (Ri=πSi(R)) và trên mỗi
quan hệ Ri này tồn tại một tập phụ thuộc hàm ℑi là kết quả của phép chiếu tập phụ
thuộc ℑ trên tập thuộc tính Si. Vấn đề đặt ra là liệu tập phụ thuộc hàm ban đầu ℑ
có được bảo toàn nguyên vẹn sau khi phân tách và kết tự nhiên các quan hệ chiếu
Ri với các tập phụ thuộc hàm ℑi đó hay không.
VÍ DỤ 8.18: Phép phân tách không bảo toàn phụ thuộc hàm.
Giả sử chúng ta có quan hệ PROJECT4(PName, DName, PLocation) cho biết tên
dự án, đơn vị thực hiện, và địa điểm thực hiện dự án.
Chúng ta có các phụ thuộc hàm: (1) PName → DName, (2) PLocation DName →
PName. Phụ thuộc hàm (1) cho biết mỗi dự án do một đơn vị thực hiện. Phụ thuộc
hàm (2) cho biết một đơn vị không thực hiện hai dự án tại cùng địa điểm.
Chúng ta tiến hành phân tách quan hệ PROJECT4 thành hai quan hệ với lược đồ
lần lượt là R1={PName, DName} và R2={PName, PLocation}. Phép phân tách này
phát sinh vấn đề đối với phụ thuộc hàm (2). R1 có duy nhất một phụ thuộc hàm là
PName → DName, trong khi R2 không có phụ thuộc hàm. Do đó, khi kết hai quan
hệ này lại với nhau, quan hệ nhận được không thỏa mãn phụ thuộc hàm (2)
PLocation DName → PName (xem hình 8.7).
Hình 8.7. Phép phân tách không bảo toàn phụ thuộc hàm.
Cho quan hệ R với tập phụ thuộc hàm F, X và Y là hai tập hợp các thuộc tính của
R. Phụ thuộc hàm X → Y được gọi là phụ thuộc hàm đầy đủ nếu xóa bất kỳ thuộc
tính nào ra khỏi X thì phụ thuộc hàm này không tồn tại nữa. Nói cách khác,
∀A∈X, (X – {A}) không xác định hàm Y.
VÍ DỤ 8.19: Chuẩn hóa quan hệ phi chuẩn về dạng chuẩn thứ nhất.
Quan hệ phi chuẩn DEPARTMENT_0:
DNUMBER DNAME DLOCATION
1 Phòng Phần mềm trong nước TP. Cần Thơ
TP. Đà Nẵng
TP. Hà Nội
TP. Hồ Chí Minh
2 Phòng Phần mềm nước ngoài TP. Đà Nẵng
TP. Hà Nội
TP. Hải Phòng
Một quan hệ R được gọi là ở dạng chuẩn thứ hai (2NF) khi và chỉ khi nó ở dạng
chuẩn thứ nhất và mọi thuộc tính không khóa của R phụ thuộc hàm đầy đủ vào
khóa chính của nó.
Để nhận biết một quan hệ có ở dạng chuẩn hai hay không, chúng ta chỉ cần kiểm
tra xem quan hệ đó có phụ thuộc hàm nào vế phải là thuộc tính không khóa, còn
vế trái là tập con thực sự của khóa chính. Nếu tồn tại một phụ thuộc hàm như thế,
chúng ta kết luận ngay quan hệ đó không ở dạng chuẩn hai.
Một khi quan hệ không ở dạng chuẩn thứ hai, chúng ta có thể phân tách nó thành
nhiều quan hệ ở dạng chuẩn thứ hai sao cho các thuộc tính không khóa tương ứng
chỉ phụ thuộc hàm đầy đủ vào khóa chính của nó mà thôi. Nói cách khác, phép
phân tách quan hệ về dạng chuẩn thứ hai được thực hiện dựa trên tập các phụ
thuộc hàm hiện có của quan hệ.
Để nhận biết một quan hệ có ở dạng chuẩn thứ ba hay không, chúng ta có thể sử
dụng định nghĩa thứ hai về dạng chuẩn thứ ba như sau:
Quan hệ R được gọi là ở dạng chuẩn thứ ba (3NF) khi và chỉ khi mọi phụ thuộc
hàm không hiển nhiên A1A2...An →B1B2...Bm trong quan hệ R phải thỏa mãn một
trong hai điều kiện sau đây:
Tập các thuộc tính {A1, A2, ..., An} là siêu khóa,hoặc
Các thuộc tính Bk không nằm trong Ai đều là thành viên của một khóa
nào đó (không nhất thiết phải cùng một khóa).
Điều này có nghĩa là, một quan hệ thuộc dạng chuẩn BCNF khi và chỉ khi vế trái
của mọi phụ thuộc hàm không hiển nhiên trên quan hệ đó đều phải là siêu khóa.
Do siêu khóa chứa khóa, nên điều kiện BCNF còn có thể được phát biểu như sau:
Vế trái của mọi phụ thuộc hàm không hiển nhiên phải chứa khóa.
Tuy nhiên, chúng ta không thể tìm thấy một phép phân tách quan hệ nào thỏa mãn
cả ba tiêu chí này. Trong phạm vi giáo trình, chúng tôi giới thiệu hai phép phân
tách dựa trên các dạng chuẩn cơ sở dữ liệu phổ biến nhất hiện nay:
Phép phân tách dựa trên dạng chuẩn Boyce – Codd và
Phép phân tách dựa trên dạng chuẩn thứ ba.
Ở phần 8.5.5 chúng ta đã chỉ ra rằng các quan hệ có hai thuộc tính luôn ở dạng
chuẩn BCNF. Tuy nhiên, nếu chúng ta phân tách mọi quan hệ ra thành những quan
hệ có hai thuộc tính, thì (1) thỏa mãn, nhưng (2) phần lớn bị vi phạm. Chúng ta lặp
lại ví dụ 8.15 để minh họa điều này.
VÍ DỤ 8.15: Phân tách quan hệ thành những quan hệ có hai thuộc tính.
Xét quan hệ R(A,B,C) gồm hai bộ lần lượt (1,2,3) và (4,2,5). Giả sử chúng ta phân
tách R thành R1(A,B) và R2(B,C).
Chính vì việc không phải phép phân tách quan hệ ra thành nhiều quan hệ có hai
thuộc tính đều đảm bảo không tổn thất thông tin, cho nên chúng ta phải sử dụng
các phụ thuộc hàm vi phạm điều kiện BCNF để thực hiện việc phân tách. Phép
phân tách được thực hiện cho đến khi nào tất cả quan hệ thu được đều thỏa mãn
điều kiện BCNF. Phép phân tách sẽ kết thúc sau một số lần hữu hạn thực hiện, bởi
vì, một quan hệ sau khi phân tách sẽ cho ra hai quan hệ có số thuộc tính nhỏ hơn
số thuộc tính của quan hệ gốc. Trong trường hợp xấu nhất, tất cả các quan hệ thu
được đều chỉ có hai thuộc tính – hiển nhiên thỏa mãn điều kiện BCNF.
8.6.2 Đánh giá phép phân tách quan hệ về dạng chuẩn BCNF
8.6.2.1 Khôi phục thông tin sau khi phân tách quan hệ
Trong phần trước, chúng ta đã nhận định rằng các quan hệ gồm hai thuộc tính đều
ở dạng chuẩn BCNF. Chúng ta cũng đã chỉ ra rằng phép phân tách quan hệ R
thành những quan hệ Ri bất kỳ chỉ gồm hai thuộc tính thì dẫn đến trường hợp
không khôi phục lại được quan hệ R từ phép kết tự nhiên các quan hệ Ri.
Để chứng minh điều này, chúng ta lấy ví dụ đối với quan hệ R(A,B,C) và phụ
thuộc hàm B → C vi phạm điều kiện BCNF, nghĩa là B không phải là khóa ngoại.
Phép phân tách dựa trên phụ thuộc hàm B → C sẽ tạo hai quan hệ với lược đồ
quan hệ tương ứng R1(A,B) và R2(B,C).
Gọi t là một bộ của R, ký hiệu t=(a,b,c), với a, b, c lần lượt là các thành phần của t
tương ứng với các thuộc tính A, B, và C. Do R1(A,B) = πA,B(R), nên trong R1 xuất
hiện bộ t1 = πA,B(t) = (a,b). Tương tự, do R1(B,C) = πB,C(R), nên trong R2 xuất hiện
bộ t2 = πB,C(t) = (b,c). Khi áp dụng phép kết tự nhiên cho hai bộ t1 và t2 (cùng giá
trị b tại thuộc tính B), chúng ta nhận được bộ t ban đầu. Như vậy, khi phân tách bất
kỳ bộ t nào thành hai bộ t1 và t2, chúng ta đều có thể nhận lại bộ t bằng phép kết tự
nhiên hai bộ t1 và t2.
Tuy nhiên, trong một số trường hợp phép kết tự nhiên trả về một bộ t mà chúng ta
không chắc chắn bộ t này có thực sự là một bộ của quan hệ R trước khi phân tách.
Ví dụ, có hai bộ trong quan hệ R, lần lượt là t=(a,b,c), và u=(d,b,e). Khi chiếu t
xuống R1(A,B), u xuống R2(B,C), chúng ta nhận hai bộ t1=(a,b), và u1=(b,e). Phép
kết tự nhiên giữa hai bộ này diễn trên thao giá trị b của thuộc tính B, và kết quả trả
về là bộ (a,b,e). Chúng ta không chắc rằng bộ (a, b, e) có thuộc R hay không.
Với giả định phụ thuộc hàm B →C đúng trên quan hệ R, chúng ta có thể khẳng
định rằng bộ (a,b,e) phải thuộc quan hệ R. Vì t và u có giá trị bằng nhau tại thuộc
tính B, cho nên chúng cũng có giá trị bằng nhau tại thuộc tính C (đồng nghĩa với
c=e). Vì vậy bộ (a,b,e) bằng với bộ (a,b,c).
KẾT LUẬN:
Nếu chúng ta phân tách quan hệ R bằng thuật toán 8.3, thì quan hệ gốc R có
thể được khôi phục hoàn toàn bởi phép kết tự nhiên của các quan hệ Ri đạt
được từ thuật toán này.
8.6.2.2 Bảo toàn phụ thuộc hàm sau khi phân tách quan hệ
Trong nhiều trường hợp, chúng ta không thể phân tách một quan hệ bất kỳ thành
nhiều quan hệ BCNF đáp ứng đồng thời cả hai yêu cầu không tổn thất thông tin và
bảo toàn phụ thuộc hàm. Dưới đây là ví dụ 8.29 minh họa cho trường hợp mà
chúng ta phải chọn lựa giữa bảo toàn phụ thuộc hàm và BCNF.
VÍ DỤ 8.29: Phép phân tách không bảo toàn phụ thuộc hàm.
Lặp lại ví dụ 8.18 với quan hệ PROJECT4(PName, DName, PLocation) với các
phụ thuộc hàm: (1) PName→DName, và (2) PLocation DName → PName.
Vì quan hệ PROJECT4 có hai khóa là {PName, PLocation} và {PLocation,
DName} nên (1) vi phạm điều kiện BCNF. Do đó, thuật toán 8.3 thực hiện phép
phân tách PROJECT4 theo phụ thuộc hàm PName→DName. Phép phân tách này
cho ra hai quan hệ mới có lược đồ là (PName, DName) và (PName, PLocation)
với tập phụ thuộc hàm lần lượt là {PName→DName} và {PName, PLocation}.
Hình 8.7 minh họa số liệu cụ thể cho phép phân tách này. Rõ ràng sau khi phân
tách và kết tự nhiên các quan hệ nhận được, phụ thuộc hàm (2) không được duy
trì. Do đó, phép phân tách nói trên không bảo toàn được phụ thuộc hàm trong
PROJECT4.
Hình 8.7. Phép phân tách không bảo toàn phụ thuộc hàm
Trong mục này, chúng ta sẽ xây dựng một phương pháp phân tách quan hệ thành
các quan hệ 3NF trong khi vẫn đảm bảo tính bảo toàn phụ thuộc hàm và khả năng
khôi phục thông tin sau khi phân tách.
8.6.4 Đánh giá phép phân tách quan hệ về dạng chuẩn 3NF
Để đánh giá thuật toán tách quan hệ về dạng chuẩn 3NF, chúng ta cần thể hiện ba
vấn đề qua phép phân tách này:
Chúng ta làm quen với một số vấn đề về lỗi dị thường trong quá trình thiết kế dữ
liệu. Để khắc phục các vấn đề này, chúng ta tiến hành phân tách quan hệ. Quá
trình phân tách được thực hiện phải tuân theo một số nguyên tắc, để có thể cho ra
những quan hệ đạt chuẩn. Trong chương này, chúng ta tập trung nghiên cứu hai
dạng chuẩn phổ biến nhất hiện nay, đó là dạng chuẩn Boyce – Codd (BCNF), và
dạng chuẩn thứ ba (3NF). Thuật toán phân tách quan hệ về dạng chuẩn BCNF áp
dụng đối với những quan hệ có phụ thuộc hàm vi phạm điều kiện BCNF, để trả về
một tập các quan hệ thỏa mãn điều kiện BCNF. Thuật toán này đảm bảo dữ liệu
được phục hồi nguyên vẹn sau khi phân tách. Tuy nhiên, các phụ thuộc hàm sau
khi phân tách sẽ không được bảo toàn. Với thuật toán phân tách quan hệ về dạng
chuẩn 3NF, không những thông tin được khôi phục hoàn toàn sau khi phân tách,
mà phép phân tách này còn duy trì các phụ thuộc hàm trên quan hệ ban đầu.
9
TỐI ƯU HÓA TRUY VẤN
Mục tiêu
Chương này cung cấp cho người đọc các kiến thức từ cơ bản tới chuyên sâu về
vấn đề tối ưu hóa câu truy vấn nhằm giúp họ có sự lựa chọn thích hợp khi xây
dựng các câu truy vấn đáp ứng các chiến lược khai thác dữ liệu khác nhau.
Nội dung
Tổng quan về tối ưu hóa truy vấn
Kỹ thuật tối ưu hóa truy vấn
Phương pháp khung nhìn
Trong chương 8 chúng ta đã nghiên cứu vấn đề chuẩn hóa cơ sở dữ liệu về dạng
BCNF hay 3NF. Chuẩn hóa cơ sở dữ liệu là nhiệm vụ hàng đầu của nhân viên thiết
kế cơ sở dữ liệu. Tác dụng của việc chuẩn hóa là để giảm thiểu những sai sót trong
quá trình thiết kế dữ liệu, mà cụ thể đó là giảm sự trùng lặp dữ liệu, những vấn đề
khi chỉnh sửa hay xóa bỏ dữ liệu. Đó cũng chính là cách chúng ta tối ưu hóa cơ sở
dữ liệu về không gian lưu trữ.
Chúng ta xây dựng cơ sở dữ liệu nhằm mục đích để cung cấp những thông tin cần
thiết khi có yêu cầu. Các câu truy vấn được xây dựng để giải quyết vấn đề đó. Và
tất nhiên, chúng ta cũng có yêu cầu các câu truy vấn này phải được thực hiện trong
một thời gian ngắn nhất, mà vẫn cho ra kết quả chính xác. Xây dựng các câu truy
vấn hiệu quả cao chính là cách mà chúng ta tối ưu hóa cơ sở dữ liệu về tốc độ hay
thời gian xử lý. Do đó, tối ưu hóa câu truy vấn là một vấn đề đặc biệt quan trọng
đối với người sử dụng, khai thác cơ sở dữ liệu.
VÍ DỤ 9.1: Biểu diễn câu truy vấn SQL bằng (các) biểu thức đại số quan hệ.
Xét câu truy vấn SQL sau đây trong cơ sở dữ liệu COMPANY:
Q1: SELECT EName
FROM EMPLOYEE
WHERE ESalary > ( SELECT MAX (ESalary)
FROM EMPLOYEE
WHERE DNum = 5)
Câu truy vấn lồng này được biểu diễn bằng hai câu truy vấn đơn như sau:
Q1a: SELECT MAX (ESalary)
FROM EMPLOYEE
WHERE DNum = 5
Q1b: SELECT EName
FROM EMPLOYEE
WHERE ESalary > C
Với C là kết quả trả về từ câu truy vấn Q1a.
Hai biểu thức đại số quan hệ tương đương với hai câu truy vấn này lần lượt là:
ℑMAX ESalary σDNum=5(EMPLOYEE))
(σ
Tóm lại, một khi nói đến tối ưu hóa một câu truy vấn SQL, chúng ta tìm cách biểu
diễn câu truy vấn đó về dạng biểu thức đại số quan hệ. Sau đó chúng ta tiến hành
tối ưu hóa biểu thức đại số quan hệ này thông qua cây đại số quan hệ bằng các
phương pháp tối ưu hóa thích hợp để nhận được một biểu thức được đánh giá là
tốt hơn, nhưng cho ra cùng kết quả với biểu thức ban đầu. Cuối cùng, chúng ta
biểu diễn biểu thức này bằng một câu truy vấn SQL.
Vấn đề đặt ra ở đây là dựa trên tiêu chuẩn nào để chúng ta xác định cây đại số
quan hệ hiện có đã tối ưu hay chưa. Nói cách khác, chúng ta cần phải ước lượng
chi phí thực hiện các phép tính trên cây đại số quan hệ để từ đó phát hiện ra được
những sự điều chỉnh cần thiết để tiết kiệm được chi phí thực hiện.
Chúng ta bắt đầu đánh giá cây biểu thức đại số quan hệ từ các phép toán ở mức
phấp nhất (tức là các biểu thức tại đáy của cây). Các phép toán này có đầu vào là
các quan hệ được lưu trữ vật lý trong cơ sở dữ liệu; đồng thời kết quả trả về của
chúng được lưu trữ trong các quan hệ tạm. Tiếp theo, chúng ta có thể sử dụng các
quan hệ tạm này làm đầu vào để thực hiện các phép toán ở mức trên tiếp theo
trong cây biểu thức. Bây giờ đầu vào của phép toán có thể là các quan hệ tạm hoặc
là các quan hệ được lưu trữ trong cơ sở dữ liệu. Chúng ta cứ tiếp tục như thế cho
đến khi đạt đến đỉnh của cây biểu thức.
VÍ DỤ 9.2: Ước lượng chi phí thực hiện của một biểu thức đại số quan hệ.
Để ước lượng chi phí của thao tác ghi lên đĩa, chúng ta cần tính tới kích thước của
ba bảng tạm phát sinh trong quá trình thực hiện câu truy vấn. Đầu tiên đó là bảng
tạm T1 chứa kết quả của phép chọn trên DEPARTMENT. Kế tiếp khi thực hiện
phép kết tự nhiên giữa T1 với EMPLOYEE chúng ta có bảng tạm T2. Cuối cùng,
bảng tạm T3 được tạo để chứa kết quả của phép chiếu trên T2.
Để cải thiện chi phí thực hiện cũng như chi phí lưu trữ, các nguyên tắc sau đây
giúp chúng ta tối ưu hóa câu truy vấn thông qua việc thay đổi trình tự thực hiện
các phép toán trong biểu thức đại số quan hệ tương đương:
Một cách khái quát, các nguyên tắc sau đây có thể giúp chúng ta tối ưu hóa câu
truy vấn thông qua việc thay đổi trình tự thực hiện các phép toán:
Ưu tiên thực hiện các phép toán một ngôi nhằm giới hạn khối lượng dữ liệu
trung gian được lưu trữ trong các bảng tạm, đồng thời cũng làm giảm chi
phí đọc và ghi bảng tạm vào đĩa cứng.
Hạn chế việc thực hiện các phép nhân chéo giữa hai quan hệ với tất cả các
thuộc tính của chúng. Hạn chế kích thước của các quan hệ tham gia phép
nhân chéo bằng phép chọn và phép chiếu.
Phép kết bằng kết nối các bộ giữa hai quan hệ có giá trị bằng nhau tại các
thuộc tính trùng tên. Do đó, chi phí thực hiện phép kết bằng sẽ thấp hơn
nhiều so với chi phí thực hiện phép nhân chéo.
Do phép chọn và phép chiếu có tính chất giao hoán và kết hợp, do đó chúng
ta có thể nhóm các phép chọn và phép chiếu liên tiếp thành một phép toán
duy nhất nhằm giảm khối lượng dữ liệu trung gian.
Xác định các thành phần bị lặp lại trong câu truy vấn. Trong trường hợp sự
lặp lại này khá thường xuyên, chúng ta nên lập câu truy vấn con để khai
thác khả năng tính toán và lưu trữ một lần nhưng sử dụng nhiều lần sau đó.
Đánh giá sơ bộ chi phí thực hiện câu truy vấn theo những trình tự thực hiện
khác nhau. Chi phí trong trường hợp này bao gồm: số phép toán thực hiện,
chi phí thời gian, không gian lưu trữ, …
Khi thực hiện các phép toán trong biểu thức đại số quan hệ, chúng ta phải quan
tâm tới trình tự thực hiện các phép toán trong trường hợp không sử dụng dấu
ngoặc đơn. Các phép toán một ngôi có thứ tự ưu tiên cao hơn so với các phép toán
hai ngôi.
Tối ưu hóa thực chất là xác định trình tự thực hiện các phép toán trong biểu thức
đại số nhằm tiết kiệm chi phí thực hiện, không gian lưu trữ cũng như thời gian
thực hiện nhưng không làm thay đổi kết quả trả về. Ba phép toán được sử dụng
thường xuyên nhất trong biểu thức đại số là chọn, chiếu và kết. Phép chọn và phép
chiếu cho ra quan hệ kết quả có kích thước nhỏ hơn quan hệ ban đầu. Trong khi
đó, kết quả của phép chiếu là một quan hệ có kích thước lớn hơn rất nhiều so với
các quan hệ tham gia. Dựa trên các tính chất này, chúng ta xây dựng các kỹ thuật
tối ưu hóa và áp dụng chúng trong từng trường hợp cụ thể.
Hình 9.2. Biểu diễn quy tắc (1) bằng cây biểu thức.
Hình 9.3. Biểu diễn quy tắc (2) bằng cây biểu thức.
Quy tắc 3: Thay thế nhiều phép chiếu liên tiếp bằng một phép chiếu duy nhất
Nếu E là biểu thức đại số quan hệ và L1, L2 là hai tập thuộc tính của E, L1 ⊆ L2
(R7): πL2(πL1(E)) = πL2(E)
Hình 9.4. Biểu diễn quy tắc (3) bằng cây biểu thức.
Quy tắc 4: Thay thế nhiều phép chọn liên tiếp bằng một phép chọn duy nhất
Nếu E là biểu thức đại số quan hệ và F, F1, F2, …, Fn là các điều kiện trên tập
thuộc tính của E, F = F1 ∧ F2 ∧ … ∧ Fn
(R8): σF1(σF2(…σF1(E)…)) = σ F1 ∧ F2 ∧ … ∧ Fn (E) = σF(E)
Hình 9.6. Biểu diễn quy tắc (5) bằng cây biểu thức.
Hình 9.7. Biểu diễn quy tắc (6) bằng cây biểu thức.
Hình 9.8. Biểu diễn quy tắc (7) bằng cây biểu thức.
Hình 9.9. Biểu diễn quy tắc (8) bằng cây biểu thức.
Hình 9.10. Biểu diễn quy tắc (9) bằng cây biểu thức.
Quy tắc 10: Giao hoán phép chọn và phép kết tự nhiên
Nếu E1, E2 là hai biểu thức đại số quan hệ và F là điều kiện trên các thuộc tính
chung của hai biểu thức này:
(R16): σF(E1 ⋈ E2) = σF(E1) ⋈ σF(E2)
Hình 9.11. Biểu diễn quy tắc (10) bằng cây biểu thức.
Quy tắc 11: Giao hoán phép chiếu và phép nhân chéo
Nếu E1, E2 là hai biểu thức đại số quan hệ, L1, L2 lần lượt là tập các thuộc tính
của E1 và E2:
(R17): πL1, L2(E1 × E2) = πL1(E1) × πL2(E2)
Hình 9.12. Biểu diễn quy tắc (11) bằng cây biểu thức.
Hình 9.14. Biểu diễn quy tắc (13) bằng cây biểu thức.
Thuật toán tập trung chủ yếu vào nhiệm vụ làm giảm bớt khối lượng dữ liệu
trung gian chứ không giúp xác định trình tự thực hiện các phép kết.
Thuật toán cung cấp một phương án để chúng ta lựa chọn khi thực thi cây
truy vấn, đây chưa phải là phương án tốt nhất.
Các phép biến đổi còn có thể được thực hiện dựa trên tập hợp đầy đủ các
phép toán đại số quan hệ chứ không chỉ gói gọn vào các phép toán được
trình bày.
THUẬT TOÁN 9.1: Tối ưu hóa biểu thức đại số quan hệ.
Đầu vào: Biểu thức đại số quan hệ cần tối ưu (biểu diễn bởi cây biểu thức)
Đầu ra: Biểu thức đại số quan hệ tối ưu (biểu diễn bởi cây biểu thức)
Thuật toán:
Bước 1: Áp dụng quy tắc R4 tách phép chọn phức tạp thành một chuỗi các
phép chọn liên tiếp. Đối với mỗi phép chọn, tiếp tục áp dụng các quy tắc từ
R4 đến R11 nhằm đẩy các phép chọn xuống càng sâu càng tốt
Bước 2: Đối với mỗi phép chiếu, áp dụng các quy tắc R3, R6, R8, R12 để
chiếu quan hệ trên những thuộc tính cần sử dụng và đẩy các phép chiếu
xuống càng sâu càng tốt.
Bước 3: Tổ hợp phép nhân chéo với phép chọn thành phép kết có điều kiện
Bước 4: Nhận diện các cây con mà các phép toán của nó thực hiện theo
đường không rẽ nhánh và thực thi chúng.
Để minh họa cho việc áp dụng thuật toán tối ưu hóa biểu thức đại số quan hệ nói
trên, chúng ta lần lượt xét một ví dụ liên quan đến cơ sở dữ liệu COMPANY được
sử dụng trong giáo trình này.
Áp dụng thuật toán 9.1 để tối ưu hóa biểu thức đại số quan hệ theo trình tự sau
đây:
Hình 9.16. Áp dụng quy tắc (4) để biến đổi cây biểu thức.
(2) Áp dụng quy tắc (12) để giao hoán phép chiếu và phép nhân chéo
Hình 9.17. Áp dụng quy tắc (12) để biến đổi cây biểu thức.
Bước 3: Kết hợp phép chọn và phép nhân chéo thành phép kết có điều kiện:
Sau khi khung nhìn được tạo ra, chúng ta có thể thực hiện các câu truy vấn có sử
dụng khung nhìn như là một quan hệ lưu trữ khác trong CSDL. Các bảng dữ liệu
xuất hiện trong lệnh tạo khung nhìn được gọi là bảng cơ sở của khung nhìn. Trong
phạm vi giáo trình, chúng ta không đi sâu vào nghiên cứu khung nhìn và các vấn
đề liên quan, chúng ta chỉ giới hạn vào việc định nghĩa và sử dụng khung nhìn như
là một công cụ hỗ trợ tối ưu hóa câu truy vấn.
Giả sử chúng ta có khung nhìn V được định nghĩa từ phép kết nối R ⋈ S. Chúng ta
có thể sử dụng khung nhìn V này để giảm chi phí thực hiện câu truy vấn R ⋈ S ⋈
T. Cụ thể, câu truy vấn này có thể được viết lại là R ⋈ T. Ví dụ sau đây minh họa
các sử dụng khung nhìn để tối ưu hóa câu truy vấn.
VÍ DỤ 9.5: Thực hiện câu truy vấn (biểu diễn bằng cây biểu thức).
Cho biết số nhân viên tham gia từng dự án do phòng số 1 quản lý.
Cách 1: Không sử dụng khung nhìn, cây biểu thức có dạng như hình 9.19.
Hình 9.20. Cây biểu thức tương ứng khi không sử dụng khung nhìn.
Cách 2: Sử dụng khung nhìn V1, cây biểu thức có dạng như hình 9.20.
Rõ ràng, với việc sử dụng V1, chi phí thực hiện câu truy vấn đã giảm đi đáng kể.
Ghi chú: Chúng ta còn có thể biến đổi biểu thức này bằng cách áp dụng các quy
tắc được trình bày ở mục 9.3.
Để tối ưu hóa câu truy vấn chúng ta sử dụng biểu thức đại số quan hệ tương ứng
với câu truy vấn đó. Chúng ta dựa trên kích thước không gian lưu trữ tạm thời
trong quá trình thực thi phép toán để ước lượng chi phí của biểu thức đại số quan
hệ. Bản chất của quá trình tối ưu hóa là tìm cách biến đổi biểu thức hiện có để đạt
được một biểu thức khác cho kết quả tương tự nhưng có chi phí thấp hơn. Quá
trình tối ưu được sự hỗ trợ của hàng loạt các quy tắc biến đổi tương đương dựa
trên ba phép toán cơ bản: chọn, chiếu và nhân chéo.
Cuối cùng, vì câu truy vấn là một dãy tuần tự gồm nhiều phép toán, kết quả của
phép toán trước là đầu vào của phép toán sau, chúng ta có thể lưu trữ quan hệ kết
quả đó trong các khung nhìn khác nhau và sử dụng lại chúng mỗi khi cần thiết.
Việc sử dụng khung nhìn như thế không chỉ giúp rút ngắn thời gian thực hiện truy
vấn mà còn góp phần vào việc tối ưu hóa câu truy vấn.