Mô hình dữ liệu quan hệ của e.f.codd
Phần mở đầu của chương III sẽ trình bày kỹ hơn về các khái niệm đã được nhắc tới trong chương II về cách tiếp cận mô hình dữ liệu kiểu quan hệ và sẽ coi đó như là những cơ sở nền tảng để tiếp tục nghiên cứu các phần tiếp theo. Thuộc ...
Phần mở đầu của chương III sẽ trình bày kỹ hơn về các khái niệm đã được nhắc tới trong chương II về cách tiếp cận mô hình dữ liệu kiểu quan hệ và sẽ coi đó như là những cơ sở nền tảng để tiếp tục nghiên cứu các phần tiếp theo.
Thuộc tính (Attribute):
Thuộc tính là một tính chất riêng biệt của một đối tượng cần được lưu trữ trong CSDL để phục vụ cho việc khai thác dữ liệu về đối tượng.
+Ví dụ 3.1.1:
-Đối tượng KHOA (tương ứng với loại thực thể KHOA trong mô hình thực thể kết hợp) có các thuộc tính Mã-khoa, Tên-khoa.
-Loại thực thể LỚP-HỌC có một số thuộc tính Mã-lớp, Tên-lớp, Niên-khóa, Số-học-viên.
-Loại thực thể MÔN-HỌC có một số thuộc tính Mã-môn, Tên-môn, Số-Đv-Học-Trình.
-Loại thực thể HỌC-VIÊN có một số thuộc tính Mã-khoa, Mã-học-viên, Tên-học-viên, Ngày-sinh, Quê-quán.
-Loại thực thể GIẢNG-VIÊN có một số thuộc tính Mã-giảng-viên, Tên-giảng-viên, Cấp-học-vị, Chuyên-ngành. v.v...
Các thuộc tính được đặc trưng bởi một tên gọi, kiểu giá trị và miền giá trị của chúng. Trong giáo trình này, để trình bày một cách tổng quát và nếu không cần lưu ý đến ngữ nghĩa thì tên của các thuộc tính thường được ký hiệu bằg các chữ cái in hoa đầu tiên trong bảng chữ cái la tinh: A, B, C, D, ... Những chữ cái X, Y, W, Z, ... dùng thay cho một nhóm (hay tập hợp) gồm nhiều thuộc tính. Đôi khi còn dùng các ký hiệu chữ cái với các chỉ số A1, A2, ...., An để chỉ các thuộc tính trong trường hợp tổng quát hay muốn đề cập đến số ngôi (hay số lượng các thuộc tính) của một quan hệ.
Trong các ứng dụng thực tế, người phân tích - thiết kế thường đặt tên thuộc tính một cách gợi nhớ; nhưng để làm rõ hơn ý nghĩa của những tên gọi, người ta có thể đặt tên khá dài cho các thuộc tính với các chữ in hoa đầu từ hoặc viết cách nhau bởi dấu gạch chân (Underscore: _ ).
Trong các ví dụ của tài liệu này, các tên thuộc tính được viết bằng tiếng Việt gồm nhiều từ Việt nối với nhau bởi dấu trừ (-) có chữ cái đầu tiên được viết in hoa nhằm mục đích chuyển tải cả ngữ nghĩa của tên thuộc tính. Điều này không có gì sai, bởi vì hiện nay có một số hệ quản trị CSDL cho phép làm như vậy (MicroSoft Access, SQL-Server cho phép đặt tên dài tới 255 ký tự và có thể có chứa các khoảng trắng, các ký tự tiếng Việt có dấu và các ký tự đặc biệt khác). Những tên thuộc tính hoặc tên quan hệ như vậy, khi sử dụng trong Micro Soft Access hoặc SQL-Server phải viết chúng trong cặp dấu ngoặc vuông ( [ ] ), khi sử dụng trong ORACLE phải viết trong cặ dấu nháy kép (“” – Quotes). Trong tài liệu này chúng ta sử dụng ký pháp của SQL-Server.
Trong cài đặt cụ thể với một hệ quản trị CSDL cần lưu ý đến khía cạnh đặt tên cho các bảng cũng như tên của thuộc tính. Trong hầu hết các ngôn ngữ lập trình nói chung và một số ngôn ngữ quản trị CSDL nói riêng, tên đối tượng (tên biến, tên quan hệ hay tên thuộc tính v.v...) đều chỉ được phép viết bằng các chữ cái la tinh, chữ số và/hoặc dấu gạch chân (underscore ‘_’), bắt đầu bằng chữ cái hoặc dấu gạch chân, với độ dài tên theo quy định. Theo lý thuyết, người ta vẫn khuyên rằng không nên đặt tên thuộc tính quá dài (bởi vì nó làm cho việc viết các câu lệnh truy vấn trở nên vất vả hơn) và cũng không nên đặt tên thuộc tính quá ngắn (vì nó không cho thấy ngữ nghĩa của thuộc tính của quan hệ), đặc biệt là không đặt trùng tên hai thuộc tính mang ngữ nghĩa khác nhau thuộc hai đối tượng khác nhau. Chẳng hạn, nếu có hai đối tượng HỌC-VIÊN và GIẢNG-VIÊN đều có thuộc tính TÊN thì nên đặt tên thuộc tính rõ ràng là Tên_học-viên của loại đối tượng HỌC-VIÊN và Tên-giáo-viên cho đối tượng GIẢNG-VIÊN, bởi vì 2 thuộc tính TÊN đó mang ngữ nghĩa khác nhau trong 2 quan hệ khác nhau.
Mỗi thuộc tính đều phải thuộc một kiểu kiểu dữ liệu (Data Type) nhất định. Kiểu dữ liệu có thể là vô hướng (đó là các kiểu dữ liệu cơ bản như chuỗi - String hoặc Text hoặc Charater, số - Number, Luận lý - 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ột số kiểu dữ liệu vô hướng sau đây thường được sử dụng trong các hệ quản trị CSDL :
- Text (hoặc Character, String, hoặc Char) – kiểu văn bản.
- Number (hoặc Numeric, hoặc float) – kiểu so
- Logical (hoặc Boolean) – kiểu luận ly
- Date/Time – kiểu thời gian : ngày tháng năm + giờ phút
- Memo (hoặc VarChar) – kiểu văn bản có độ dài thay đổi.
Mỗi hệ quản trị CSDL có thể gọi tên các kiểu dữ liệu nói trên bằng các tên gọi khác nhau, ngoài ra còn bổ sung thêm một số kiểu dữ liệu riêng của mình. Chẳng hạn, MicroSoft Access có kiểu dữ liệu OLE để chứa các đối tượng nhúng như hình ảnh, âm thanh, audio, video … ORACLE có kiểu dữ liệu LONG cho phép chứa dữ liệu có kích thước lớn tới 2 tỷ bytes.
Mỗi thuộc tính có thể chỉ chọn lấy những giá trị trong một tập hợp con của kiểu dữ liệu. Tập hợp các giá trị mà một thuộc tính A có thể nhận được gọi là miền giá trị (domain) của thuộc tính A và được ký hiệu là MGT(A) hoặc Dom(A).
-Ví dụ 3.1.2:
Học viên đang theo học tại trường ĐH.KHTN thì tuổi của họ nhiều nhất là 60 và tuổi ít nhất là 18, vừa mới tốt nghiệp PTTH. Mặc dù nói rằng Năm-sinh của học viên là một số nguyên, nhưng không phải số nguyên nào cũng có thể được chọn để gán vào thuộc tính Năm-sinh. Giá trị năm sinh của học viên chỉ cần lưu 2 chữ số sau của năm sinh tức là chỉ cần một byte để ghi nhận những năm sinh của họ trong thế kỷ 20: từ năm 40 đến năm 82. Với miền giá trị chỉ chứa từ 40 đến 82, như vậy chỉ cần dùng 1 byte để lưu là đủ.
Nếu kiểu dữ liệu của thuộc tính A là có cấu trúc thì miền giá trị của A là tích Đề-các (hoặc tập con của tích Đề-các - Cartesian) của các miền giá trị thành phần.
-Ví dụ 3.1.3:
Ta có kiểu dữ liệu ngày tháng năm theo dương lịch với mô tả bằng ngôn ngữ Pascal như sau:
Type DATE = Record
Day : 1 .. 31;
Month : 1 .. 12;
Year : 0 .. 2500;
End;
Tích Đề-các của 3 miền giá trị của các thành phần là [1 .. 31] x [1 .. 12] x [0 .. 2500]. Nếu thuộc tính A thưộc kiểu DATE thì MGT(A) Ì [1..31] x [1..12] x [0..2500], bởi vì {30,02,1999} không phải là một ngày tháng năm hợp lệ nên tổ hợp đó không thuộc MGT(A). Ngày nay, hầu hết các ngôn ngữ quản trị dữ liệu đều có định nghĩa kiểu này như một kiểu cơ bản. Tổ hợp 3 giá trị thành phần luôn luôn được kiểm tra tính đúng đắn trước khi được coi là một giá trị kiểu ngày tháng. Hai phép toán số học có thể tác động trên kiểu DATE là phép cộng (+) hoặc trừ (-) một DATE với một số nguyên để cho kết quả là một giá trị kiểu DATE; hiệu 2 giá trị kiểu DATE là số ngày trôi qua giữa 2 ngày tháng năm đó.
Trong nhiều hệ quản trị CSDL, người ta thường đưa thêm vào miền giá trị của các thuộc tính một giá trị đặc biệt gọi là giá trị rỗng (NULL). Tùy theo ngữ cảnh mà giá trị này có thể đặc trưng cho một giá trị không thể xác định được hoặc một giá trị chưa được xác định ở vào thời điểm nhập tin nhưng có thể được xác định vào một thời điểm khác.
Nếu thuộc tính có kiểu dữ liệu là vô hướng thì nó được gọi là thuộc tính đơn hoặc thuộc tính nguyên tố; nếu thuộc tính có kiểu dữ liệu có cấu trúc thì ta nói rằng nó là thuộc tính kép (hay không phải là nguyên tố).
Quan hệ (Relation):
Một quan hệ R có n ngôi được định nghĩa trên tập các thuộc tính U = {A1, A2, ... An} (thứ tự của các thuộc tính là không quan trọng) và kèm theo nó là một tân từ, tức là một quy tắc để xác định mối quan hệ giữa các thuộc tính Ai và được ký hiệu là R (A1, A2, ... An). Tập thuộc tính của quan hệ R đôi khi còn được ký hiệu là R+.
Với Ai là một thuộc tính có miền giá trị là MGT(Ai), như vậy R(A1, A2, ... An) là tập con của tích Đề-các: MGT(A1) x MGT(A2) x ... x MGT(An).
Quan hệ còn được gọi bằng thuật ngữ khác là bảng (Table).
-Ví dụ 3.1.4:
KHOA (Mã-khoa, Tên-khoa), là một quan hệ 2 ngôi.
Tân từ: "Mỗi khoa có một tên gọi và một mã số duy nhất để phân biệt với tất cả các khoa khác của trường".
-Vi dụ 3.1.5:
LỚP-HỌC (Mã-lớp, Tên-lớp, Niên-khóa, Số-học-viên, Mã-khoa) là quan hệ 5 ngôi với tân từ: "Mỗi lớp học trong trường có một mã số quy ước duy nhất để phân biệt với tất cả các lớp học khác trong trường; có một tên gọi của lớp học, một số lượng học viên theo học và thuộc một khoa của trường".
-Ví dụ 3.1.6:
MÔN-HỌC (Mã-môn, Tên-môn, Số-đv-học-trình) là quan hệ 3 ngôi.
Tân từ: "Mỗi môn học có một tên gọi cụ thể, được học trong một số đơn vị học trình nhất định và ứng với môn học là một mã số duy nhất để phân biệt với mọi môn học khác".
-Ví dụ 3.1.7:
HỌC-VIÊN (Mã-học-viên, Tên-học-viên, Ngày-sinh, Quê-quán, Mã-lớp) là quan hệ 5 ngôi.
Tân từ: "Mỗi học viên có một họ và tên, ngày sinh, quê quán, ... và được cấp một mã số duy nhất để phân biệt với mọi học viên khác trong trường; học viên được ghi danh vào một lớp học duy nhất trong trường".
Trong chương này chúng ta chỉ đề cập tới những khái niệm cơ bản do đó các phép toán khác trên các quan hệ sẽ được trình bày chi tiết trong chương V. Ba thao tác cơ bản trên một quan hệ, mà nhờ đó CSDL được thay đổi, đó là Thêm (Insert), Xóa (Delete) và Sửa (Update) các bộ giá trị của quan hệ.
Phép thêm một bộ mới vào quan hệ.
Việc thêm một bộ giá trị mới t vào quan hệ R (A1, A2, ... An) làm cho thể hiện TR của nó tăng thêm một phần tử mới: TR = TR t. Dạng hình thức của phép thêm bộ mới là:
INSERT (R; Ai1=v1, Ai2 =v2, ... Aim= vm)
trong đó, Ai1, Ai2, ... Aim là các thuộc tính, và v1, v2, ... vm là các giá trị thuộc MGT(Ai1), MGT(Ai2) , ..., MGT(Aim) tương ứng.
Cần lưu ý rằng các thuộc tính không có tên trong danh sách gán giá trị của bộ t trong câu lệnh INSERT sẽ có giá trị là NULL, tức là giá trị không xác định.
-Ví dụ 3.1.17:
Quan hệ:
HỌC-VIÊN (Mã-học-viên, Tên-học-viên, Ngày-sinh, Quê-quán, Mã-lớp).
Thêm bộ q5 = (SV002, Hoàng Thị Chính, 17/05/1967, Hà nội, QTKD1) vào quan hệ HỌC-VIÊN bởi phép thêm như sau:
INSERT (HỌC-VIÊN; [Mã-học-viên]=Hoàng Thị Chính, [Ngày-sinh]=17/05/1967, [Quê-quán]=Hà nội, [Mã-lớp]=QTKD1).
Thể hiện THỌC-VIÊN giờ đây là:
q1 = (SV001, Nguyễn Văn Nam, 27/03/1970, Cần Thơ, QTKD1)
q5 = (SV002, Hoàng Thị Chính, 17/05/1967, Hà nội, QTKD1)
q2 = (SV005, Vũ Thị Tuyết Mai, 26/02/1968, Đồng Nai, KTKC1)
q3 = (SV014, Hồng Đăng, 30/04/1975, Đồng Nai, CNTK3)
q4 = (SV015, Lê Hoài Nhớ, 23/03/1965, Long An, CNTK4)
Xin lưu ý là quan hệ HỌC-VIÊN có khóa là Mã-học-viên, do đó bản ghi mới q5 được đẩy lên vị trí thứ 2 theo thứ tự tăng dần giá trị của khóa. Cũng vì lý do này, phép thêm bản ghi mới còn được gọi là phép chèn. [7].
Nếu xem thứ tự của các thuộc tính là cố định và giá trị v1, v2, ... vm là hoàn toàn tương ứng thì phép chèn có thể viết dưới dạng tường minh như sau:
INSERT (R; v1, v2, ... vm).
Phép chèn có thể không thực hiện được hoặc làm mất tính nhất quán của dữ liệu trong CSDL vì các lý do:
- Giá trị khóa của bộ mới là rỗng (NULL) hoặc trùng với giá trị khóa của một bộ đã có trong CSDL. Trong trường hợp này hệ quản trị CSDL không cho bổ sung.
- Bộ mới không phù hợp với lược đồ quan hệ. Trường hợp này có thể xảy ra khi người sử dụng lầm lẫn thứ tự, kiểu hoặc độ lớn của các thuộc tính. Hệ quản trị CSDL có thể không cho bổ sung nếu không tương thích kiểu giá trị, hoặc vẫn cho bổ sung bộ mới nhưng tính nhất quán dữ liệu không được đảm bảo.
- Một số giá trị của bộ mới không thuộc miền giá trị của thuộc tính tương ứng. Trong trường hợp này, nếu quan hệ đã được đảm bảo tính nhất quán bởi các RBTV về miền giá trị thì hệ quản trị CSDL sẽ không cho bổ sung, nếu không có RBTV như vậy thì tính nhất quán của dữ liệu bị vi phạm mà hệ quản trị CSDL không phát hiện được.
Phép loại bỏ bộ khỏi quan hệ.
Phép loại bỏ (hoặc xóa bỏ) một bộ t của quan hệ sẽ lấy đi (những) bộ t khỏi thể hiện của quan hệ. TR = TR t. Phép loại bỏ được viết một cách hình thức như sau:
DELETE (R; Ai1=v1, Ai2 =v2, ... Aim= vm).
trong đó Aij=vj (j = 1, 2, ..., m) được coi như những điều kiện thỏa một số thuộc tính của bộ t để loại bỏ một bộ ra khỏi quan hệ.
Ví dụ 3.1.18:
Quan hệ:
HỌC-VIÊN (Mã-học-viên, Tên-học-viên, Ngày-sinh, Quê-quán, Mã-lớp)
Với phép loại bỏ như sau:
DELETE (HỌC-VIÊN; [Quê-quán]=Đồng nai).
Thì các bộ:
q2 = (SV005, Vũ Thị Tuyết Mai, 26/02/1968, Đồng Nai, KTKC1)
q3 = (SV014, Hồng Đăng, 30/04/1975, Đồng Nai, CNTK3)
sẽ bị loại bỏ ra khỏi quan hệ HỌC-VIÊN bởi vì cùng có chung Quê-quán là Đồng nai. Thể hiện THỌC-VIÊN lúc này là:
q1 = (SV001, Nguyễn Văn Nam, 27/03/1970, Cần Thơ, QTKD1)
q5 = (SV002, Hoàng Thị Chính, 17/05/1967, Hà nội, QTKD1)
q4 = (SV015, Lê Hoài Nhớ, 23/03/1965, Long An, CNTK4)
Phép sửa đổi giá trị của các thuộc tính của quan hệ.
Dữ liệu của CSDL đôi khi cũng cần phải được đổi mới theo thời gian hoặc sửa lại cho đảm bảo tính chính xác hoặc nhất quán của dữ liệu. Do đó thao tác sửa dữ liệu (Update) là rất cần thiết. Một số hệ quản trị CSDL đưa ra nhiều câu lệnh khác nhau để sửa đổi dữ liệu: EDIT, CHANGE, BROW, UPDATE (như DBase, FoxPro v.v...). Trong ngôn ngữ hình thức, mục này đưa ra một dạng của phép sửa đổi giá trị các bộ của quan hệ:
UPDATE (R; Ai1=c1, Ai2 =c2, ... Aim= cm; Ai1=v1, Ai2 =v2, ... Aim= vm).
Trong đó R là quan hệ cần thực hiện sửa đổi; Aij= cj (j = 1, 2, ..., m) là điều kiện tìm kiếm bộ giá trị để sửa và Aij= vj (j = 1, 2, ..., m) là giá trị mới của bộ.
Ví dụ 3.1.19:
Quan hệ
HỌC-VIÊN (Mã-học-viên, Tên-học-viên, Ngày-sinh, Quê-quán, Mã-lớp)
Với phép sửa đổi giá trị như sau:
UPDATE (HỌC-VIÊN; [Mã-học-viên]=SV015, [Quê-quán]=Sông Bé)
thì giá trị của bộ q4 được sửa lại thành:
q4 = (SV015, Lê Hoài Nhớ, 23/03/1965, Sông Bé, CNTK4)