2-2 Tại sao lại có tên là mô hình "quan hệ"?

2-2 Tại sao lại có tên là kiểu mẫu "quan hệ"?

Tại sao không phải tên là mô hình "bảng"? Chúng ta vẫn hàng ngày sử dụng từ ngữ như là "Cở sở dữ liệu quan hệ" hay "Mô hình quan hệ". Nhưng những lúc đó chúng ta vẫn chưa thực sự cảnh giác đến ý nghĩa của từ "quan hệ". Tuy nhiên, từ này có bao gồm trong mình một ý nghĩa rất sâu.

Thỉnh thoảng chúng ta vẫn có câu hỏi như "Tại sao lại gọi là mô hình quan hệ?". Tại sao không gọi là mô hình kiểu bảng? Thực ra ở đây có 2 lý do. (1) Khi suy nghĩ về mô hình quan hệ, trong những người có liên quan đến xử lý dữ liệu có xu hướng suy nghĩ phải biểu hiện quan hệ giữa nhiều đối tượng bằng cấu trúc dữ liệu liên kết với nhau. Để giải quyết hiểu nhầm này thì người ta đã chọn cái tên là mô hình quan hệ. (2) So với quan hệ thì bảng có tính trừu tượng thấp hơn. Chúng ta có thể có ấn tượng rằng bảng có thể gọi những dãy giống nhau theo vị trí của nó, nhưng nếu là quan hệ n mục thì không phải thế. Hơn nữa, về cả việc không có sự liên quan giữa thứ tự dòng với nội dung thông tin trong bảng thì ở đây bảng rất dễ gây hiểu nhầm. Tuy nhiên, kể cả có những khuyết điểm nhỉ như thế này thì bước quan trọng để có thể thể hiện được khái niệm quan hệ đó chính là bảng. Nếu nói là bảng thì ai cũng hiểu.

--E.F.Codd--

Định nghĩa của quan hệ

Mô hình dữ liệu sử dụng cơ sở dữ liệu quan hệ là cơ sử dữ liệu sử dụng mô hình quan hệ, ngược với thứ tự nên được gọi với cái tên là cơ sở dữ liệu quan hệ. Ở đây quan hệ (relation) là gì thì nó là từ ngữ được sử dụng tự nhiên mà không có ý niệm gì, nên từ quan hệ trong mô hình quan hệ rất dễ bị nhầm với từ quan hệ mà ta dùng trong thường ngày như "quan hệ con người" ,...

Nói chung chúng ta không phải sử dụng từ "quan hệ" một cách trừu tượng mà chỉ cần hiểu nó như mô hình "bảng" là được. Không phải cuối cùng thì "quan hệ" không phải là bảng 2 chiều hay sao? Nghi vấn này đã phát sinh từ khi mô hình quan hệ được hình thành. Cuối cùng thì quan hệ, quan hệ, quan hệ là cái gì?

Ngay chính người cha đẻ ra mô hình quan hệ là Codd cũng thỉnh thoảng cũng bị hỏi những câu hỏi như thế này thì tự mình ông cũng đưa ra 2 lý do. Trong đó, lý do đầu tiên không liên quan gì lắm đến kĩ sư DB hiện nay. Cấu trúc dữ liệu kết nối đó chính là cấu trúc danh sách kết nối cũng dữ liệu bằng index. Đây chính là lý do đặc hữu cho thời kì mà trào lưu vẫn là cấu trúc dữ liệu theo kiểu mô hình tầng và mô hình network.

Mặt khác, lý do thứ (2) cũng vẫn đem lại giá trị đáng suy nghĩ đến bây giờ. Vì nó có quan hệ đến bảng chất của khái niệm quan hệ. Nếu nói bằng một câu thì quan hệ và bảng mặc dù có điểm giống nhau nhưng là hai thứ khác nhau. Để có thể hiểu được điểm này thì tôi sẽ đưa ra một vài điểm khác nhau đại biểu giữa quan hệ và bảng.

  • Trong quan hệ thì không thể tồn tại những bộ (tuple) trùng nhau nhưng trong bảng thì có thể tồn tại. Có nghĩa là quan hệ với ý nghĩa được nói thông thường là tập hợp không chấp nhận sự trùng nhưng bảng là tập hợp có trùng (multiset).
  • Nhóm của quan hệ thì từ trên xuống dưới không được gắn thứ tự nhưng dòng của bảng thì được gắn quan hệ.
  • Thuộc tính của quan hệ không được gắn thứ tự từ trái sang phải nhưng trong dãy của bảng thì từ trái sang phải vẫn được gán thứ tự.
  • Tất cả những giá trị thuộc tính của quan hệ thì không thể phân chia thêm nữa nhưng đối với bảng thì vẫn có thể phân chia thêm. Nói một cách khác thì thuộc tính của quan hệ thoả mãn dạng chuẩn đầu nhưng dãy của bảng thì không.

Như đã nêu lên ở trên thì quan hệ và bảng có khá nhiều điểm khác nhau. So với quan hệ thì bảng là khái niệm có cách định nghĩa thoáng hơn. Nhưng tại đây lại có thêm những từ ngữ vẫn chưa được định nghĩa như bộ dữ liệu, thuộc tính,... Chúng ta có thể tưởng tượng nhóm là hàng, thuộc tính là dãy cũng được. Bộ và thuộc tính là những từ ngữ chuyên dụng công khai được sử dụng trong mô hình quan hệ. Dưới đây là những từ ngữ thường được dùng trong thường ngày.

Từ chuyên dụng của mô hình quan hệ Ngôn ngữ thường ngày không mang tính hình thức
Quan hệ (Relation) Bảng hoặc là table
Bộ dữ liệu (tuple) Dòng hoặc record
Nồng độ (cardinality) Số dòng
Thuộc tính (attribute) Dãy hoặc field
Bậc (degree) Số dãy
Miền xác định (domain) Tập hợp lấy những giá trị của dãy

Ở trên có vẻ như là một sự xuất hiện của hàng loạt dụng ngữ chính thức nhưng cũng không cần quá để ý. Trên thực tế thì ta cứ nói dãy là "Thuộc tính" hay số dòng là "Nồng độ" cũng không tốt. Nói chung, mô hình quan hệ được xây dựng trên cơ sở là luận tập hợp của toán học nên những từ được sử dụng ở đây cũng chính là những từ được sử dụng trong luận tập hợp. Tuy nhiên nếu đọc những quyển sách mà tác giả là nhà luận học coi trọng tính nghiêm khắc logic thì có thể họ sẽ sử dụng cách nói dãy là thuộc tính hay hàng là bộ dữ liệu nên cũng không thừa khi chúng ta nhớ những khái niệm này.

Cuối cùng tại đây tôi xin giới thiệu một cách chính xác định nghĩa về quan hệ. Định nghĩa chỉ được thể hiện chỉ trong một dòng công thức.

R ∈ (D1 x D2 x D3 ... x Dn)

(Lấy quan hệ là R, thuộc tính là Ai, miền định nghĩa thuộc tính đó là Di)

Chúng ta đọc là Quan hệ R là tập hợp bộ phận của miền định nghĩa D1, D2, ... Đây là công thức rất rõ ràng nhưng chính vì vậy nó sẽ trở nên khó hiểu, vì vậy tôi xin phân tích vào ví dụ đơn giản. Giả sử chúng ta có 3 thuộc tính a1, a2 và a3. Miền giá trị của mỗi thuộc tính được định nghĩa như dưới đây. Miền giá trị này cũng giống như miền giá trị trong toán học, chính là phạm vi mà giá trị thoả mãn thuộc tính. Giả sử đối với a1 có thể lấy 1 chủng loại, a2 có 2 chủng loại và thuộc tính a3 có 3 chủng loại. Miền giá trị đối ứng với từng thuộc tính thì ta gọi là d1, d2 và d3.

d1 = {1}
d2 = {nam, nữ}
d3 = {đỏ, xanh, vàng}

Trường hợp tạo quan hệ sử dụng 3 miền giá trị ở đây thì chúng ta có thể tối đa tạo được bao nhiêu quan hệ có những thuộc tính đó đây? Đáp án đơn giản là 6. Về chi tiết được viết ở bảng dưới đây.

a1 a2 a3
1 nam đỏ
1 nam xanh
1 nam vàng
1 nữ đỏ
1 nữ xanh
1 nữ vàng

Quan hệ R1 này chính là trực tích ta có được ở đây. Trực tích ở đây là tập hợp lớn nhất là kết hợp có thể tạo được sử dụng miền giá trị của mỗi thuộc tính. Như vậy, tất cả những quan hệ Rn được tạo ra từ 3 miền giá trị bên trên trở thành tập hợp bộ phận của trực tích. Mặt khác ở đây có một điểm cần chú ý đó chính là có thể định nghĩa quan hệ với số bộ dữ liệu bằng 0. (Quan hệ có nồng độ bằng 0 trong luận tập hợp tức là tập hợp rỗng. Tất nhiên, trong thực hiện thì đó là bảng 0 dòng.)

Đây chusnh là ý nghĩa của từ quan hệ mà chúng ta thường dùng trong mô hình quan hệ hay cơ sở dữ liệu quan hệ. Người sáng tạo ra cách định nghĩa như thế này ban đầu là Codd nhưng cái tên quan hệ mà ông ta dùng không có nghĩa đây là từ mà ông ta nghĩ ra. Luận tập hợp từ xưa đã gọi tập hợp bộ phận của trực tích từ 2 tập hợp là quan hệ bậc 2. Như vậy chúng ta có thể mở rộng ra quan hệ bậc n. Ông ta cũng từng là một nhà toán học nên tất nhiên cũng biết đến quan hệ trong luận tập hợp như vậy và chỉ mượn từ trong đó thôi.

Nỗi u buồn của miền giá trị

Chắc cũng nhiều độc giả đã phát hiện ra, tức là miền giá trị thực tế không khác gì kiểu dữ liệu (được lý giải theo ngôn ngữ lập trình hiện đại). Ví dụ dưới đây là cách biểu hiện đúng theo ngôn ngữ lập trình Pascal.

type Day = { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
var Today : Day;

Tại đây, ta gọi dạng dữ liệu mà người dùng định nghĩa là "Day" (Số giá trị đúng vừa đúng 7), biến số người dùng định nghĩa được định nghĩa liên quan đến dạng dữ liệu đó gọi là "Today" (được gán qui tắc là lấy 7 giá trị bên trên). Với tình trạng này thì miền giá trị được gọi là "Day" và cơ sở dữ liệu mô hình quan hệ mang những thuộc tính "Today" được định nghĩa trên miền xác định đó là giống nhau.

Cũng như đã nói ở trên, khi tiến hành định nghĩa chính thức về quan hệ thì đã xuất hiện khái niệm Miền giá trị (domain). Từ này cũng có thể là một từ với không ít người đã là kĩ sư DB có kinh nghiệm. Vì vẫn chưa có DBMS nào thực hành miền xác định nên đây không là điều vô lý. Mặc dù là một từ khoá quan trọng tồn tại từ khi mô hình quan hệ được sinh ra (nếu không có miền xác định thì cũng không thể quyết định được quan hệ) nhưng khái niệm này cho đến hiện tại cũng đang khá bị coi thường. Nhưng đến SQL-92 đã được đưa vào trong chuẩn nên chắc là từ bây giờ sẽ có nhiều DBMS đưa vào thực hiện.

Cách nói vẫn còn ít DBMS đưa vào thực thi miền xác định thì cũng chưa chính xác. Đó là vì miền xác định ở trình độ cực kì nguyên thuỷ ngược lại đã được tất cả các DBMS thực thi. Nhưng đó chỉ là những dạng dữ liệu được gọi là dạng scalar như dạng số hay dạng chữ. Vì phạm vi giá trị có thoả mãn thuộc tính cũng được giới hạn nên không muốn nói là nghèo nàn, chính mô hình Scalar chính là một loại trong miền xác định. Chúng ta không thể đưa vào dãy chữ như [abc] vào dãy khai báo hay INTEGER. Nhưng bằng cách sử dụng CHECK có thể giới hạn đến chi tiết hơn rất nhiều so với chỉ sử dụng giá trị scalar. Ví dụ đối với dãy khai báo sex định dạng chữ thì giá trị có khả năng đưa vào nếu chỉ có thể là 'f' và 'm' thì chúng ta có thể ghi như sau, "CHECK (sex IN('m', 'f')).

Vì vậy hiện nay DBMS đã được chuẩn bị những miền xác định đơn giản. Tuy nhiên cũng không ở trình độ cao. Nếu nói cơ sở dữ liệu bằng ngôn ngữ lập trình thì DBMS hiện tại chính là ngôn ngữ lập trình mô hình được định nghĩa từ đầu thì có thể sử dụng nhưng mô hình người dùng định nghĩa thì không thể dùng được.

Giá trị quan hệ và biến số quan hệ

Ngày xưa, nhà triết học Heraclitus đã từng nói "Con người không thể hai lần dẫm vào cùng một dòng sông giống nhau. Đó là tại vì thực chất của dòng sông đó chính là không ngừng thay đổi". Ý nghĩa trong câu nói của nhà triết học này muốn biểu hiện cuối cùng chính là vấn đề "Cơ sở đảm bảo tính đồng nhất của sự vật chính là gì?"

Cuối cùng thì sự vật dựa vào cơ sở nào để được đảm bảo? Ngay cả cơ thể chúng ta trong 1 tuần thì tất cả tế bào đều được thay nhưng chúng ta sau 1 tuần có trở thành một con người khác không? Người bạn mà chúng ta nói chuyện hôm nay ngày mai cũng vẫn là một người, chúng ta dựa vào điều gì để tin điều đó?

Chúng ta dừng nói chuyện ngoài lề và bắt đầu vào đề tài chính. Giá trị (value) và biến số (variable) là hai khái niệm dễ hỗn loạn và trong nghị luận về cơ sở dữ liệu cũng có nhiều lúc sử dụng lẫn lộn hai khái niệm này. Bình thường trong trường hợp chúng ta không quan niệm gì mà sử dụng từ "Quan hệ" thì đó chính là chỉ ý nghĩa "Biến số quan hệ". Mặt khác, giá trị quan hệ nghĩa là giá trị mà biến số lấy trong khoảnh khắc đó một cách chủ ý. Nói một cách khác thì giá trị có khi chúng ta cũng có thể nói theo cách nói nó là time-slice của biến số.

Một nguyên nhân dẫn đến sự nhầm lẫn này chính là sự không rõ ràng trong phân biệt hai khái niệm này ngay từ luận văn đầu tiên của Codd. Trong luận văn của ông có xuất hiện từ ngữ "Quan hệ biến hoá thời gian (time-varying)" nhưng nói một cách chính xác, đây là biến số quan hệ để thay đổi thời gian. Là vì giá trị quan hệ không thay đổi thời gian.

Đây là quan hệ giống với quan hệ được hình thành giữa giá trị và biến số trong ngôn ngữ lập trình cũng như trong toán học. Đối với chương trình, để đưa giá trị của số thực vào biến số dạng số thực thì đối với mô hình quan hệ thì ta đưa giá trị quan hệ vào biến số dạng quan hệ. Vì những khái niệm về giá trị và biến số mà chúng ta được học ở trường học cũng hầu hết đơn giản đều là giá trị dạng scalar nên chẳng qua chỉ là chúng ta chưa quen với việc nhìn sự tồn tại phức hợp như quan hệ thành một giá trị mà thôi. Tên của bảng được viết trong câu lệnh FROM chính là tên của biến số.

Với ý nghĩa này thì chúng ta có thể coi tên từng người trong chúng ta là một biến số. Thực ra thực thể để chỉ tên như Mike hay Yamada có thể thay đổi từng khắc, tuy nhiên ngay cả việc có thể đưa vào những cái tên (tên biến số) thì nó được dùng trên thế giới như một biến số đồng nhất.

Như vậy, nếu ta giải thích sự khác nhau giữa giá trị và biến số cho Heraclitus không hiểu ông sẽ phản ứng như thế nào? Hẳn ông sẽ nói "Quá chán! Biến số là thứ chán ngắt! Thứ tồn tại duy nhất trên đời này chỉ có giá trị thôi!".

Có thể có quan hệ của quan hệ không?

Nếu bị hỏi là có thể có quan hệ của quan hệ không thì chắc hẳn mọi người sẽ có ấn tượng đột ngột nhưng nói chung hãy đi cùng tôi một chút. Đây là câu chuyện phát triển từ điểm nhìn "Nhìn quan hệ như một giá trị" của chương trước.

Đối với câu hỏi có thể có quan hệ của quan hệ không thì nếu nói một cách khác thì đó chính là

Có thể hồi quy quan hệ không?

Hoặc,

Có thể bao gồm quan hệ trong miền xác định không?

Quan hệ của quan hệ về mặt logic thì là có thể. Tuy nhiên để làm được điều đó thì chúng ta cần thiết phải định nghĩa vị từ được bao gồm trong vùng xác định của quan hệ, rồi cũng phải nghĩ đến việc lượng hoá đối với quan hệ như thế nào, cũng cần có đối ứng đối với logic vị từ bậc 2 và nói chung trên thực tế thì đây là một điều khá vất vả.

Tại đây thì chúng ta thử đảo mắt qua mô hình quan hệ có thể chấp nhận quan hệ của quan hệ mà vẫn chưa được hình thành trên thực tế. Đầu tiên hãy nhìn bảng cụ thể dưới đây.

12.PNG

Đây đúng là một bảng phức tạp, nhưng cũng chính như dãy chữ tên của nó, "Quan hệ ở trong quan hệ". Cũng có thể nói đây là có bảng ở trong bảng cũng được. Dãy (Thuộc tính) bao gồm quan hệ kiểu này được gọi là thuộc tính giá trị quan hệ (Relation-Valued Attribute), và hiện nay đang có rất nhiều nghiên cứu đang được diễn ra sử dụng mô hình quan hệ kiểu này.

Nói như vậy, nếu đã chấp nhận kiểu quan hệ của quan hệ này tồn tại thì chắc hẳn cũng sẽ đưa ra những kiểu "quan hệ của quan hệ của quan hệ" hay "quan hệ của quan hệ của quan hệ của quan hệ", rồi chúng ta cũng có thể nghĩ đến không chỉ bậc 2 mà còn là cao cấp. Và tất nhiên đầu vào chính là cấu tạo kiểu hồi quy.

Mô hình quan hệ kiểu hồi quy này chúng ta có thể nghĩ rằng nó giống như cấu tạo Directory thì có thể dễ hiểu hơn. Trong Directory thì cũng như chúng ta có thể đặt file và directory thfi trong quan hệ thì chúng ta có thể đặt giá trị quan hệ và giá trị scala. Nên nó sẽ hình thành cấu trúc hình cây hay cũng chính là quan hệ cao tầng.

Cơ sở dữ liệu cũng như hệ thống file cũng giống như cấu trúc để lưu dữ liệu một cách hiệu quả nên cả hai muốn lấy được cấu tạo hình cây thì theo một ý nghĩa nào đó thì đó là chuyện đương nhiên. Nhưng trong cơ sở dữ liệu quan hệ chỉ có thể định nghĩa được quan hệ bậc 1 thôi nên nếu nói sang hệ thống file thì đó chính là hệ thống file chỉ có thể định nghĩa được Directory bậc 1. Điểm này thì so với hệ thống file, cơ sở dữ liệu quan hệ có độ biểu hiện nghèo nàn hơn.

DBMS có khả năng định nghĩa quan hệ tầng cao này thì hiện nay chưa có. Tuy nhiên đối với SQL thông thường thì đã có những hỗ trợ kiểu dãy hay colection, là sự thật là mô hình quan hệ đang hướng đến mở rộng sử dụng dữ liệu dạng phức hợp. Date đã nói rằng "Hệ thống quan hệ thực sự là hệ thống hỗ trợ tất cả những giá trị phức hợp như giá trị quan hệ". Vậy nên trong 10 năm sau có thể thực hiện được DBMS nào đó có khả năng định nghĩa quan hệ bậc cao.