1.1 Khái niệm cơ sở dữ liệu
Đặt vấn đề: Trong thực tế, các hoạt động quản lý và điều hành đều gắn liền với lưu trữ, xử lý và khai thác thông tin. Ví dụ quản lý hồ sơ sinh viên, nhân sự, bán hàng, tài chính. Khi dữ liệu ngày càng tăng về số lượng và độ phức tạp, cách lưu trữ rời rạc trong các tệp tin riêng lẻ của từng ứng dụng bộc lộ nhiều hạn chế: trùng lặp dữ liệu, khó bảo đảm tính nhất quán, khó chia sẻ thông tin, khó bảo mật.
Định nghĩa: Cơ sở dữ liệu là một tập hợp dữ liệu có liên quan với nhau, được tổ chức, lưu trữ và quản lý một cách có cấu trúc trên các thiết bị lưu trữ, nhằm phục vụ hiệu quả cho việc khai thác, cập nhật và chia sẻ thông tin của nhiều người dùng theo các yêu cầu xác định.
So sánh với tệp tin truyền thống:
- Tổ chức dữ liệu: tệp tin rời rạc trong các tệp riêng lẻ; cơ sở dữ liệu tổ chức tập trung, có cấu trúc.
- Dư thừa dữ liệu: tệp tin cao, dễ trùng lặp; cơ sở dữ liệu giảm tối đa dư thừa.
- Tính nhất quán: tệp tin khó bảo đảm khi cập nhật; cơ sở dữ liệu bảo đảm nhờ ràng buộc.
- Chia sẻ dữ liệu: tệp tin khó chia sẻ, thường theo từng ứng dụng; cơ sở dữ liệu dễ chia sẻ cho nhiều người dùng.
- Toàn vẹn dữ liệu: tệp tin phụ thuộc chương trình; cơ sở dữ liệu do hệ quản trị kiểm soát tự động.
- Bảo mật: tệp tin thô sơ, khó phân quyền; cơ sở dữ liệu phân quyền chi tiết, linh hoạt.
- Độc lập dữ liệu: tệp tin phụ thuộc chặt vào chương trình; cơ sở dữ liệu có tính độc lập cao.
- Khả năng mở rộng: tệp tin khó mở rộng, bảo trì; cơ sở dữ liệu dễ mở rộng và nâng cấp.
- Truy vấn dữ liệu: tệp tin cần lập trình riêng; cơ sở dữ liệu truy vấn linh hoạt.
- Sao lưu - phục hồi: tệp tin thủ công, không đồng bộ; cơ sở dữ liệu hỗ trợ tự động, an toàn.
- Xử lý đồng thời: tệp tin hạn chế, dễ xung đột; cơ sở dữ liệu hỗ trợ nhiều người dùng.
- Hiệu suất tổng thể: tệp tin giảm khi dữ liệu lớn; cơ sở dữ liệu tối ưu cho dữ liệu lớn.
Ví dụ: Thay vì mỗi phòng ban trong trường đại học giữ một tệp Excel riêng về sinh viên, một cơ sở dữ liệu sinh viên dùng chung giúp tránh trùng lặp và bảo đảm mọi phòng ban thấy cùng một thông tin.
1.2 Vai trò của cơ sở dữ liệu trong hệ thống thông tin
Cơ sở dữ liệu là nền tảng của hệ thống thông tin, bảo đảm dữ liệu được tổ chức, lưu trữ, khai thác và bảo vệ hiệu quả. Các vai trò chính:
- Tổ chức và quản lý dữ liệu: dữ liệu phải được tổ chức có cấu trúc, phản ánh đúng thế giới thực; hạn chế dư thừa, bảo đảm tính nhất quán khi cập nhật; hỗ trợ lưu trữ lâu dài và truy xuất hiệu quả.
- Đảm bảo toàn vẹn dữ liệu: kiểm soát ràng buộc miền giá trị như kiểu dữ liệu và phạm vi; bảo đảm ràng buộc khóa không trùng, không rỗng; bảo đảm ràng buộc tham chiếu giữa các quan hệ; ngăn chặn dữ liệu không hợp lệ hoặc mâu thuẫn.
- Bảo mật và phân quyền truy cập: xác định ai được phép xem, thêm, sửa, xóa dữ liệu; ngăn chặn truy cập trái phép; bảo vệ dữ liệu nhạy cảm.
- Xử lý truy cập đồng thời: nhiều người dùng có thể thao tác cùng lúc; tránh xung đột dữ liệu, mất mát hoặc sai lệch thông tin; bảo đảm các giao dịch không ảnh hưởng lẫn nhau.
- Đảm bảo tính nhất quán trong giao dịch: mỗi giao dịch phải thỏa mãn các tính chất ACID: nguyên tố (Atomicity) thực hiện toàn bộ hoặc không thực hiện gì; nhất quán (Consistency) đưa cơ sở dữ liệu từ trạng thái nhất quán này sang trạng thái nhất quán khác; cô lập (Isolation) các giao dịch đồng thời không ảnh hưởng lẫn nhau; bền vững (Durability) các giao dịch được lưu trữ vĩnh viễn dù hệ thống bị sập.
- Tính độc lập dữ liệu: thay đổi cấu trúc lưu trữ hoặc lược đồ không làm ảnh hưởng đến chương trình ứng dụng; giảm chi phí bảo trì và nâng cấp.
- Hiệu năng và tối ưu truy vấn: bảo đảm truy vấn nhanh khi dữ liệu lớn; tối ưu lưu trữ, chỉ mục, kế hoạch thực thi; cân bằng giữa hiệu năng và tài nguyên hệ thống.
- Sao lưu và phục hồi dữ liệu: phòng ngừa sự cố phần cứng, phần mềm hoặc lỗi người dùng; cho phép khôi phục dữ liệu về trạng thái đúng; bảo đảm dữ liệu không bị mất.
Tóm tắt lợi ích: lưu trữ và quản lý dữ liệu tập trung phục vụ toàn bộ hệ thống thông tin; cung cấp dữ liệu chính xác, kịp thời cho các chức năng nghiệp vụ; hỗ trợ chia sẻ và truy cập đồng thời; bảo đảm an toàn, toàn vẹn và nhất quán dữ liệu; là nền tảng cho phân tích, báo cáo và hỗ trợ ra quyết định.
1.3 Hệ quản trị cơ sở dữ liệu (DBMS)
Định nghĩa: Hệ quản trị cơ sở dữ liệu (Database Management System - DBMS) là công cụ dùng để tạo lập, lưu trữ, quản lý và khai thác cơ sở dữ liệu một cách có hệ thống. DBMS đóng vai trò trung gian giữa người dùng hoặc ứng dụng với cơ sở dữ liệu, bảo đảm dữ liệu được truy cập, cập nhật đúng, an toàn, nhất quán và hiệu quả. Một số hệ quản trị cơ sở dữ liệu phổ biến: MySQL, PostgreSQL, Microsoft SQL Server, Oracle Database, MongoDB (NoSQL).
Các chức năng chính:
- Ngôn ngữ giao tiếp: ngôn ngữ định nghĩa dữ liệu DDL khai báo cấu trúc cơ sở dữ liệu, bảng, mối liên hệ và ràng buộc; ngôn ngữ thao tác dữ liệu DML thêm, sửa, xóa dữ liệu; ngôn ngữ truy vấn SQL truy vấn và khai thác thông tin; ngôn ngữ điều khiển dữ liệu DCL quản lý bảo mật, phân quyền và kiểm soát quyền truy cập.
- Từ điển dữ liệu: mô tả và quản lý siêu dữ liệu về cấu trúc như bảng, thuộc tính, kiểu dữ liệu, khóa và ràng buộc; ghi nhận mối quan hệ giữa các bảng, khóa chính, khóa ngoại; cung cấp thông tin cấu trúc và thống kê phục vụ phân tích và tối ưu truy vấn; lưu trữ ràng buộc toàn vẹn, thông tin người dùng và quyền truy cập; hỗ trợ quản trị, bảo trì và mở rộng.
- Cơ chế giải quyết tranh chấp dữ liệu: cho phép nhiều giao dịch truy cập đồng thời nhưng bảo đảm tính nhất quán và cô lập; sử dụng cơ chế khóa để kiểm soát quyền đọc và ghi; lập lịch và cô lập giao dịch ngăn các hiện tượng bất thường như mất cập nhật, đọc không lặp lại; cho phép đọc và ghi song song để tăng hiệu năng; phát hiện và xử lý bế tắc (deadlock) để hệ thống tiếp tục hoạt động ổn định.
- Cơ chế sao lưu và phục hồi: tạo bản sao lưu định kỳ phòng ngừa mất mát dữ liệu; phục hồi về trạng thái ổn định gần nhất khi xảy ra lỗi phần cứng, phần mềm hoặc thao tác sai; hỗ trợ sao lưu toàn bộ và gia tăng; sử dụng nhật ký giao dịch (log) để phục hồi chính xác các thay đổi sau lần sao lưu cuối.
- Bảo đảm tính độc lập giữa dữ liệu và chương trình: thay đổi cấu trúc lưu trữ hoặc lược đồ không ảnh hưởng đến chương trình khai thác; hỗ trợ độc lập vật lý và độc lập logic; nhờ cơ chế mô tả dữ liệu và từ điển dữ liệu, ứng dụng chỉ làm việc với giao diện logic.
Kiến trúc chung (3 mức):
- Mức ngoài (External Level): giao diện làm việc với người dùng và chương trình ứng dụng; mỗi người dùng nhìn thấy một phần cơ sở dữ liệu (khung nhìn) phù hợp theo nhu cầu và quyền hạn; có thể có nhiều khung nhìn khác nhau. Đối tượng tương tác là người dùng, chương trình ứng dụng. Ngôn ngữ sử dụng SQL với lệnh SELECT và DML với lệnh INSERT, UPDATE, DELETE.
- Mức khái niệm (Conceptual Level): mô tả cấu trúc logic của toàn bộ cơ sở dữ liệu, ẩn đi chi tiết lưu trữ vật lý; định nghĩa tất cả thực thể, thuộc tính, mối quan hệ và ràng buộc toàn vẹn; cho cái nhìn thống nhất của quản trị viên. Sử dụng DDL với các lệnh CREATE, ALTER, mô hình dữ liệu logic (phổ biến nhất là mô hình quan hệ), ràng buộc toàn vẹn và từ điển dữ liệu (metadata).
- Mức trong (Internal Level): mô tả cách dữ liệu được lưu trữ vật lý trên các thiết bị nhớ; bao gồm tệp dữ liệu, chỉ mục (index), phương thức truy xuất, nhật ký giao dịch, cơ chế sao lưu và phục hồi; là mối quan tâm của kỹ sư hệ thống.
Các thành phần cốt lõi khác: Query Processor phân tích và tối ưu truy vấn; Storage Manager quản lý lưu trữ; Transaction Manager điều khiển giao dịch; Concurrency Control xử lý tranh chấp dữ liệu; Authorization Manager quản lý quyền truy cập.
1.4 Người sử dụng cơ sở dữ liệu
Người sử dụng cơ sở dữ liệu là các cá nhân hoặc chương trình khai thác và sử dụng dữ liệu thông qua hệ quản trị cơ sở dữ liệu. Gồm các nhóm chính với vai trò, quyền hạn và mức độ truy cập khác nhau:
- Người quản trị cơ sở dữ liệu (DBA): quản lý và kiểm soát toàn bộ hệ thống cơ sở dữ liệu; có quyền cao nhất. Nhiệm vụ: thiết kế và quản lý lược đồ cơ sở dữ liệu; cấp quyền và kiểm soát bảo mật; sao lưu và phục hồi dữ liệu; giám sát hiệu năng và xử lý sự cố.
- Người phát triển ứng dụng (Application Programmer/Developer): xây dựng các chương trình ứng dụng khai thác cơ sở dữ liệu. Nhiệm vụ: viết mã chương trình sử dụng SQL, API để truy cập dữ liệu; thiết kế giao diện và logic nghiệp vụ; bảo đảm chương trình tuân thủ các ràng buộc dữ liệu. Không trực tiếp quản trị cơ sở dữ liệu nhưng tác động lớn đến việc sử dụng dữ liệu.
- Người dùng cuối (End Users): khai thác dữ liệu thông qua ứng dụng hoặc công cụ truy vấn.
- Người dùng thông thường (Naive Users): ví dụ nhân viên bán hàng; sử dụng các form, menu có sẵn; không cần biết SQL hay cấu trúc cơ sở dữ liệu.
- Người dùng có hiểu biết (Casual/Sophisticated Users): ví dụ chuyên viên phân tích dữ liệu; truy vấn trực tiếp bằng SQL hoặc công cụ phân tích; có kiến thức nhất định về cơ sở dữ liệu.
- Người thiết kế cơ sở dữ liệu (Database Designer): thiết kế mô hình dữ liệu cho hệ thống. Nhiệm vụ: phân tích yêu cầu nghiệp vụ; xây dựng mô hình thực thể liên kết; chuyển đổi sang mô hình quan hệ. Nhóm này quyết định chất lượng cấu trúc cơ sở dữ liệu ngay từ đầu.
Hệ quản trị cơ sở dữ liệu hỗ trợ phân quyền và kiểm soát truy cập cho từng loại người dùng, bảo đảm an toàn và sử dụng hiệu quả dữ liệu trong toàn hệ thống.
1.5 Một số mô hình dữ liệu
Mô hình dữ liệu là cách thức biểu diễn, tổ chức và quản lý dữ liệu trong hệ thống cơ sở dữ liệu, làm cơ sở cho việc thiết kế và xây dựng cơ sở dữ liệu. Các mô hình dữ liệu chia thành hai nhóm chính: mô hình dữ liệu SQL (truyền thống) có cấu trúc chặt chẽ, lược đồ xác định trước; và mô hình dữ liệu NoSQL (hiện đại) linh hoạt, mở rộng lớn, phù hợp dữ liệu phi cấu trúc.
1.5.1 Mô hình dữ liệu SQL:
- Mô hình phân cấp (Hierarchical Model): tổ chức dữ liệu theo cấu trúc cây, thể hiện mối quan hệ cha - con giữa các kiểu bản ghi. Mỗi nút con chỉ có một nút cha; truy cập dữ liệu theo đường dẫn cố định; cấu trúc đơn giản nhưng kém linh hoạt. Ứng dụng: hệ thống quản lý thư mục.
- Mô hình mạng (Network Model): biểu diễn dữ liệu bằng đồ thị, trong đó một kiểu bản ghi có thể liên kết với nhiều kiểu bản ghi khác. Một nút có thể có nhiều nút cha; biểu diễn tốt các mối quan hệ phức tạp; cấu trúc và thao tác phức tạp. Ứng dụng: các hệ thống cơ sở dữ liệu thế hệ cũ.
- Mô hình thực thể - liên kết (Entity-Relationship): mô tả dữ liệu thông qua thực thể, thuộc tính và liên kết, dùng trong giai đoạn đầu của thiết kế cơ sở dữ liệu. Trực quan, dễ hiểu; thể hiện rõ yêu cầu nghiệp vụ; không dùng trực tiếp để lưu trữ dữ liệu. Vai trò: cầu nối giữa phân tích nghiệp vụ và thiết kế cơ sở dữ liệu.
- Mô hình dữ liệu quan hệ (Relational Model): tổ chức dữ liệu dưới dạng bảng (quan hệ) gồm các bộ (tuple) và thuộc tính. Có lược đồ dữ liệu xác định trước; hỗ trợ ràng buộc toàn vẹn; sử dụng SQL để thao tác dữ liệu. Hệ quản trị tiêu biểu: MySQL, PostgreSQL, Oracle, SQL Server.
- Mô hình dữ liệu hướng đối tượng (Object-Oriented Model): dữ liệu biểu diễn dưới dạng đối tượng, bao gồm thuộc tính và phương thức, tương tự lập trình hướng đối tượng. Hỗ trợ kế thừa, bao gói, đa hình; phù hợp dữ liệu phức tạp; ít phổ biến hơn mô hình quan hệ. Ứng dụng: GIS, đa phương tiện.
1.5.2 Mô hình dữ liệu NoSQL:
- Key-Value: dữ liệu lưu dưới dạng cặp khóa - giá trị. Cấu trúc đơn giản; truy xuất rất nhanh; không hỗ trợ truy vấn phức tạp. Hệ quản trị: Redis, DynamoDB.
- Document: dữ liệu lưu trữ dưới dạng tài liệu (JSON/XML). Không cố định lược đồ; linh hoạt, dễ mở rộng; phù hợp dữ liệu bán cấu trúc. Hệ quản trị: MongoDB, CouchDB.
- Graph: dữ liệu biểu diễn bằng đỉnh (node) và cạnh (edge). Tối ưu cho xử lý mối quan hệ; truy vấn quan hệ nhanh; phù hợp mạng xã hội, khuyến nghị. Hệ quản trị: Neo4j, Amazon Neptune.
1.5.3 So sánh SQL và NoSQL:
- Mô hình dữ liệu: SQL dùng bảng (quan hệ), lược đồ cố định; NoSQL dùng Key-Value, Document, Graph, Column.
- Lược đồ: SQL xác định trước, chặt chẽ; NoSQL linh hoạt, thay đổi dễ dàng.
- Ngôn ngữ truy vấn: SQL sử dụng SQL; NoSQL tùy từng hệ quản trị.
- Ràng buộc toàn vẹn: SQL mạnh, rõ ràng (miền giá trị, khóa, tham chiếu); NoSQL hạn chế hoặc do ứng dụng kiểm soát.
- Tính nhất quán: SQL theo ACID; NoSQL thường theo BASE.
- Mở rộng: SQL chủ yếu mở rộng dọc (scale up); NoSQL mở rộng ngang (scale out).
- Hiệu năng: SQL tốt với giao dịch phức tạp; NoSQL tốt với dữ liệu lớn, truy cập nhanh.
- Ứng dụng phù hợp: SQL cho hệ thống nghiệp vụ, tài chính; NoSQL cho Big Data, web, mạng xã hội.
- Hệ quản trị: SQL có MySQL, PostgreSQL, Oracle, SQL Server; NoSQL có MongoDB, Redis, Neo4j.
Ví dụ: Một hệ thống bán hàng truyền thống dùng PostgreSQL (SQL) để bảo đảm giao dịch ACID; một mạng xã hội dùng Neo4j (Graph) để gợi ý bạn bè và MongoDB (Document) để lưu hồ sơ người dùng linh hoạt.
1. Thực thể và kiểu thực thể
Mô hình thực thể liên kết (Entity-Relationship Model) do Peter Chen đề xuất năm 1976 là phương pháp mô hình hóa dữ liệu khái niệm, dùng để mô tả cấu trúc dữ liệu ở mức trừu tượng. Thành phần cơ bản nhất là thực thể: một "sự vật", "đối tượng" hoặc "khái niệm" cụ thể tồn tại và có thể phân biệt được với các đối tượng khác trong thế giới thực. Ví dụ, một quyển sách cụ thể tồn tại độc lập và phân biệt với các quyển sách khác.
Kiểu (tập) thực thể là tập hợp các thực thể có cùng các đặc trưng chung; đây là sự trừu tượng hóa các thực thể trong cùng một nhóm. Mỗi kiểu thực thể có tên riêng, thường là danh từ. Ví dụ, kiểu thực thể SACH với các đặc trưng chung: Mã sách, Tên sách, ... Kiểu thực thể SINH VIÊN có các đặc trưng: Mã sinh viên, Họ và tên, Ngày sinh, Giới tính.
| Tiêu thức | Kiểu thực thể | Thực thể |
|---|---|---|
| Khái niệm | Một tập hợp các đối tượng | Một đối tượng cụ thể |
| Số lượng | Nhiều | Một |
| Bản chất | "Khung" chứa dữ liệu | Dữ liệu cụ thể |
| Thể hiện | Tên kiểu thực thể và tên các đặc trưng | Bộ các giá trị tương ứng với các đặc trưng |
Biểu diễn đồ họa của kiểu thực thể là hình chữ nhật gồm 2 phần: tên kiểu thực thể và các đặc trưng chung.
2. Thuộc tính
Thuộc tính là một đặc trưng của một kiểu thực thể hoặc một kiểu liên kết. Mỗi thuộc tính có tên riêng, kiểu dữ liệu và miền giá trị tương ứng. Ví dụ, kiểu thực thể SINH VIÊN có thuộc tính Mã sinh viên; giữa NHÂN VIÊN và SẢN PHẨM có kiểu liên kết "bán", thuộc tính Số lượng là thuộc tính của kiểu liên kết vì phụ thuộc đồng thời vào cả hai kiểu thực thể.
- Thuộc tính đơn: giá trị đối với một thực thể là một giá trị đơn. Ví dụ, Mã sinh viên chỉ có một giá trị 4551050001.
- Thuộc tính đa trị (lặp): giá trị đối với một thực thể là một dãy các giá trị đơn. Ví dụ, Ngoại ngữ có thể có nhiều giá trị: Anh, Nga, ...
- Thuộc tính phức hợp: là sự kết tập từ nhiều thuộc tính khác. Ví dụ, Quê quán cấu thành bởi Xã, Tỉnh.
3. Khóa
Khóa của kiểu thực thể E là một hay một tập thuộc tính dùng để phân biệt hai thực thể bất kỳ trong E, tức là giá trị của khóa là duy nhất. Ví dụ, khóa của SINH VIÊN là Mã sinh viên; của LỚP là Mã lớp; của KHOA là Mã khoa; của HỌC PHẦN là Mã học phần. Khóa có thể là một thuộc tính hoặc nhiều thuộc tính; nếu kiểu thực thể chưa có thuộc tính khóa, cần bổ sung thuộc tính khóa.
1. Liên kết và kiểu liên kết
Liên kết (còn gọi là quan hệ) là sự kết hợp giữa hai hay nhiều thực thể phản ánh sự ràng buộc trong quản lý, trong đó mỗi thực thể đóng một vai trò nhất định. Ví dụ, sinh viên Nguyễn Văn An đăng ký khóa học Nhập môn cơ sở dữ liệu.
Kiểu liên kết là tập hợp các liên kết có cùng ý nghĩa, hay tập hợp các liên kết cùng loại giữa các kiểu thực thể. Ví dụ, tồn tại kiểu liên kết "Đăng ký" giữa hai kiểu thực thể SINH VIÊN và KHÓA HỌC. Biểu diễn đồ họa của kiểu liên kết là hình thoi, bên trong là tên kiểu liên kết; tên kiểu liên kết thường là động từ. Nếu kiểu liên kết 2 ngôi, cần xác định bản số ở hai đầu.
2. Bản số (ứng số)
Trong một kiểu liên kết hai ngôi R ⊆ T1 × T2, bản số của R về phía T1 (hoặc T2) là một cặp số m..n, trong đó m và n là các số tối thiểu và tối đa các thực thể trong T1 (tương ứng T2) có thể liên kết qua R với một thực thể trong T2 (tương ứng T1). Ví dụ, kiểu liên kết dạy giữa THẦY và TRÒ có bản số phía THẦY là 0..2 (số thầy mà một trò có thể học) và phía TRÒ là 1..2 (số trò mà một thầy có thể dạy).
3. Các kiểu liên kết theo bản số
- Liên kết một - một (1-1): Một thực thể của kiểu A quan hệ với một thực thể của kiểu B và ngược lại. Ví dụ, một sinh viên làm một khóa luận tốt nghiệp và một khóa luận chỉ có một sinh viên làm.
- Liên kết một - nhiều (1-n): Một thực thể của kiểu A quan hệ với nhiều thực thể của kiểu B, và một thực thể của kiểu B quan hệ với chỉ một thực thể của kiểu A. Ví dụ, một lớp sinh hoạt có nhiều sinh viên, một sinh viên chỉ thuộc một lớp sinh hoạt.
- Liên kết nhiều - nhiều (n-n): Một thực thể của kiểu A quan hệ với nhiều thực thể của kiểu B và ngược lại. Ví dụ, một giảng viên dạy nhiều sinh viên và một sinh viên được dạy bởi nhiều giảng viên.
Cần nghiên cứu và phân tích dữ liệu để xác định đúng bản số các thực thể tham gia vào kiểu liên kết, từ đó xác định chính xác kiểu liên kết giữa các kiểu thực thể trong hệ thống dữ liệu thực.
1. Kiểu thực thể con (Subtype) - tổng quát hóa
Kiểu thực thể con là dạng mở rộng của một kiểu thực thể tổng quát (supertype). Kiểu thực thể con kế thừa các thuộc tính chung từ kiểu thực thể cha và có thêm các thuộc tính riêng. Quan hệ phân cấp giữa chúng là kiểu liên kết IS-A. Đặc điểm: thể hiện quan hệ phân cấp; mỗi thực thể con là một trường hợp cụ thể của thực thể cha; dùng để mô tả hệ thống có các nhóm đối tượng khác nhau nhưng chia sẻ thông tin chung.
Ví dụ: NHÂN VIÊN có các thuộc tính Mã nhân viên, Họ và tên, Ngày sinh, Giới tính. Từ đó có kiểu thực thể con ĐẢNG VIÊN, kế thừa từ NHÂN VIÊN, có thêm các thuộc tính Mã đảng viên, Ngày vào Đảng, Ngày chính thức, Nơi vào Đảng. Quan hệ phân cấp giữa ĐẢNG VIÊN và NHÂN VIÊN là kiểu liên kết IS-A.
2. Kiểu liên kết đệ quy
Là kiểu liên kết trong đó một kiểu thực thể quan hệ với chính nó. Dùng để miêu tả cấu trúc phân cấp, quản lý hoặc thành phần cấu trúc. Thường có số ngôi là 2 nhưng trên cùng một kiểu thực thể. Ví dụ: NHÂN VIÊN có kiểu liên kết "Quản lý" trong chính nó; mỗi nhân viên có thể được quản lý bởi một nhân viên khác, một nhân viên có thể quản lý nhiều nhân viên dưới quyền. Đây là kiểu liên kết đệ quy 1-nhiều.
3. Nhiều kiểu liên kết giữa hai kiểu thực thể
Giữa hai kiểu thực thể có thể tồn tại hơn một kiểu liên kết, phản ánh các mối quan hệ nghiệp vụ khác nhau; các kiểu liên kết có bản chất và ràng buộc khác nhau. Ví dụ, giữa NGƯỜI và CĂN HỘ có thể có kiểu liên kết "Thuê" (một người có thể thuê nhiều căn hộ, một căn hộ có 1 người thuê) và kiểu liên kết "Sở hữu" (một người có thể sở hữu nhiều căn hộ, một căn hộ có 1 người sở hữu).
4. Kiểu liên kết có thuộc tính riêng
Đây là thuộc tính riêng của chính kiểu liên kết, không thuộc về kiểu thực thể nào mà thuộc về kiểu liên kết, liên quan đến các kiểu thực thể tham gia. Thường xuất hiện trong kiểu liên kết nhiều-nhiều; biểu diễn mối quan hệ giữa kiểu liên kết với thuộc tính riêng là đoạn thẳng có nét đứt. Ví dụ, SINH VIÊN và KHÓA HỌC có kiểu liên kết "Đăng ký" với thuộc tính riêng Thời gian đăng ký và Điểm trung bình.
5. Kiểu liên kết 2 ngôi nhiều-nhiều
Là kiểu liên kết giữa hai kiểu thực thể, trong đó mỗi thực thể của một bên có thể liên kết với nhiều thực thể của bên kia; rất phổ biến trong các hệ thống cơ sở dữ liệu thực tiễn. Ví dụ, giữa SINH VIÊN và GIẢNG VIÊN có kiểu liên kết "Dạy": một sinh viên được dạy bởi nhiều giảng viên, một giảng viên dạy nhiều sinh viên.
6. Kiểu liên kết nhiều ngôi
Là kiểu liên kết có từ ba kiểu thực thể trở lên tham gia, dùng để diễn đạt các hoạt động thực tế liên quan nhiều kiểu thực thể cùng lúc. Không xác định bản số như kiểu liên kết 2 ngôi vì mô tả mối quan hệ ràng buộc chung; kiểu liên kết có thể có thuộc tính riêng. Ví dụ, trong hệ thống phân phối hàng hóa, kiểu liên kết "Cung cấp" giữa NHÀ CUNG CẤP, SẢN PHẨM và CỬA HÀNG, với thuộc tính riêng Giá bán, Ngày giao, Số lượng.
| Trường hợp đặc biệt | Ý nghĩa |
|---|---|
| Kiểu thực thể con | Kế thừa, phân cấp (IS-A) |
| Kiểu liên kết đệ quy | Kiểu thực thể quan hệ với chính nó |
| Nhiều kiểu liên kết giữa hai thực thể | Mô tả nhiều quan hệ nghiệp vụ |
| Kiểu liên kết có thuộc tính riêng | Thuộc tính gắn với kiểu liên kết |
| Kiểu liên kết 2 ngôi nhiều-nhiều | Quan hệ nhiều-nhiều |
| Kiểu liên kết nhiều ngôi | Quan hệ từ 3 kiểu thực thể trở lên |
Quy trình xây dựng mô hình E-R (4 bước)
- Bước 1: Xác định danh sách các thuộc tính
- Phân tích yêu cầu nghiệp vụ: đọc mô tả bài toán, nghiên cứu tài liệu, phỏng vấn người dùng.
- Liệt kê toàn bộ thuộc tính, ví dụ Họ và tên khách hàng, Ngày sinh, Số điện thoại, Mã sản phẩm, Số lượng bán.
- Phân loại thuộc tính theo bản chất: đơn, phức hợp, đa trị.
- Loại bỏ thuộc tính trùng lặp, chỉ giữ một thuộc tính và bổ sung thuộc tính còn thiếu.
- Sử dụng thống nhất tên gọi; chính xác hóa tên gọi khi cùng tên nhưng khác ý nghĩa, ví dụ Ngày xe vào và Ngày xe ra.
- Sử dụng tên thuộc tính ngắn gọn, dễ hiểu, có tính gợi ý.
Kết quả: danh sách tất cả các thuộc tính đã được chính xác hóa, là dữ liệu đầu vào cho bước 2 và 3.
- Bước 2: Xác định kiểu thực thể, danh sách thuộc tính và khóa
- Xác định kiểu thực thể là nhóm đối tượng có cùng bản chất, cùng các thuộc tính mô tả.
- Tiêu chí nhận diện: có ý nghĩa tồn tại độc lập; có thể phân biệt các đối tượng bằng khóa; có ý nghĩa quản lý rõ ràng.
- Thường là thông tin liên quan đến con người, tài sản (KHÁCH HÀNG, MẶT HÀNG, PHÒNG) hoặc khái niệm trừu tượng (PHƯƠNG TIỆN GIAO THÔNG, NGƯỜI DÙNG).
- Gán thuộc tính cho từng kiểu thực thể: chỉ đưa vào những thuộc tính mô tả bản chất của kiểu thực thể đó.
- Chọn thuộc tính khóa (primary key) phân biệt được từng thực thể; có thể là một hoặc nhiều thuộc tính; nếu chưa có thì bổ sung.
Kết quả: danh sách kiểu thực thể cùng tập thuộc tính và khóa xác định.
- Bước 3: Xác định kiểu liên kết và thuộc tính riêng
- Nhận diện kiểu liên kết dựa vào yêu cầu nghiệp vụ.
- Xác định bản số đối với kiểu liên kết 2 ngôi để xác định kiểu liên kết 1-1, 1-nhiều, nhiều-nhiều, đệ quy. Đối với IS-A và liên kết nhiều ngôi không cần xác định bản số.
- Xác định thuộc tính riêng của liên kết nếu có, liên quan đến các kiểu thực thể tham gia, ví dụ liên kết "Mua" giữa KHÁCH HÀNG và SẢN PHẨM có Ngày mua, Số lượng mua.
Kết quả: danh sách các kiểu liên kết, bản số và thuộc tính riêng.
Lưu ý: mỗi thuộc tính chỉ xuất hiện một lần trong một kiểu thực thể hoặc một kiểu liên kết; cần sử dụng hết tất cả thuộc tính; thuộc tính được xác định từ các thuộc tính khác hoặc gán tự động không cần xem xét, ví dụ Thành tiền = Số lượng × Đơn giá.
- Bước 4: Vẽ mô hình thực thể liên kết
- Kiểu thực thể: hình chữ nhật 2 phần, phần trên tên thực thể, bên dưới danh sách thuộc tính.
- Kiểu liên kết: hình thoi chứa tên kiểu liên kết.
- Kiểu thực thể con: hình chữ nhật bên trong là mối quan hệ IS-A.
- Kiểu liên kết đệ quy: một thực thể nối với chính nó.
- Kiểu liên kết nhiều ngôi: hình thoi nối ba hoặc nhiều kiểu thực thể.
Kết quả: mô hình thực thể liên kết mở rộng. Công cụ có thể dùng: Draw.io, Microsoft Visio, Lucidchart, ERDPlus, dbdiagram.io, StarUML.
Sau khi xây dựng mô hình mở rộng, có thể chuyển về mô hình E-R kinh điển bằng các quy tắc: xử lý thuộc tính đa trị, xử lý thuộc tính phức hợp, xử lý kiểu thực thể con, xử lý kiểu liên kết 1-1, xử lý kiểu liên kết nhiều-nhiều hoặc nhiều ngôi.
Ví dụ minh họa tổng hợp: Hệ thống quản lý đào tạo
Áp dụng bốn bước xây dựng mô hình ERD cho hệ thống quản lý đào tạo đại học. Mục tiêu là quản lý sinh viên, giảng viên, khóa học, lớp học và kết quả đăng ký.
Bước 1 - Danh sách thuộc tính (trích)
- Mã sinh viên, Họ và tên sinh viên, Ngày sinh, Giới tính, Email, Mã lớp sinh hoạt.
- Mã giảng viên, Họ và tên giảng viên, Khoa, Học vị.
- Mã khóa học, Tên khóa học, Số tín chỉ.
- Thời gian đăng ký, Điểm trung bình.
- Mã lớp học, Phòng học, Ca học.
Bước 2 - Kiểu thực thể và khóa
| Kiểu thực thể | Thuộc tính | Khóa |
|---|---|---|
| SINH VIÊN | Mã sinh viên, Họ và tên, Ngày sinh, Giới tính, Email, Mã lớp sinh hoạt | Mã sinh viên |
| GIẢNG VIÊN | Mã giảng viên, Họ và tên, Khoa, Học vị | Mã giảng viên |
| KHÓA HỌC | Mã khóa học, Tên khóa học, Số tín chỉ | Mã khóa học |
| LỚP HỌC | Mã lớp học, Phòng học, Ca học | Mã lớp học |
Bước 3 - Kiểu liên kết và bản số
- SINH VIÊN - LỚP SINH HOẠT: liên kết "Thuộc" (n-1): nhiều sinh viên thuộc một lớp sinh hoạt.
- GIẢNG VIÊN - KHÓA HỌC: liên kết "Dạy" (n-n): một giảng viên dạy nhiều khóa học, một khóa học có nhiều giảng viên.
- SINH VIÊN - KHÓA HỌC: liên kết "Đăng ký" (n-n) có thuộc tính riêng Thời gian đăng ký và Điểm trung bình.
- GIẢNG VIÊN - LỚP HỌC: liên kết "Phụ trách" (1-n): một giảng viên phụ trách nhiều lớp học.
- SINH VIÊN - LỚP HỌC: liên kết "Tham gia" (n-n) có thể có thuộc tính riêng như Ngày tham gia.
Bước 4 - Mô hình ERD mở rộng
Sơ đồ ERD mở rộng thể hiện các kiểu thực thể SINH VIÊN, GIẢNG VIÊN, KHÓA HỌC, LỚP HỌC và các liên kết nêu trên, trong đó liên kết "Đăng ký" và "Tham gia" là liên kết nhiều-nhiều có thuộc tính riêng. Nếu cần chuyển về mô hình kinh điển, liên kết "Đăng ký" sẽ được chuyển thành kiểu thực thể mới DÒNG ĐĂNG KÝ với khóa là Mã sinh viên và Mã khóa học, chứa các thuộc tính Thời gian đăng ký và Điểm trung bình, nối với SINH VIÊN và KHÓA HỌC bằng liên kết 1-nhiều.
Ví dụ này tổng hợp các khái niệm: thực thể, thuộc tính, khóa, liên kết, bản số, liên kết nhiều-nhiều, thuộc tính riêng của liên kết và chuyển đổi sang mô hình kinh điển.
Bài tập 2_1 - Cửa hàng mỹ phẩm (Hóa đơn đặt hàng & bán hàng)
Bước 1 - Xác định thuộc tính: Từ hai mẫu hồ sơ, liệt kê toàn bộ thuộc tính: Số HĐ, Mã khách, Họ tên khách, Địa chỉ, Ngày đặt/bán, Địa chỉ giao, Số TT, Mã hàng, Tên hàng, ĐVT, Đơn giá, Số lượng, Thành tiền.
Bước 2 - Xác định kiểu thực thể, thuộc tính, khóa:
- KHÁCH HÀNG(Mã khách, Họ tên khách, Địa chỉ) - khóa: Mã khách.
- HÀNG(Mã hàng, Tên hàng, ĐVT, Đơn giá) - khóa: Mã hàng.
Bước 3 - Xác định kiểu liên kết và thuộc tính của liên kết:
- Liên kết đặt giữa KHÁCH HÀNG và HÀNG: Số HĐ đặt, Ngày đặt, Số lượng đặt.
- Liên kết giao giữa KHÁCH HÀNG và HÀNG: Số HĐ giao, Ngày giao, Địa chỉ giao, Số lượng giao.
Bước 4 - Bản số: Cả hai liên kết đều là nhiều-nhiều (M:N): một khách hàng có thể đặt/giao nhiều mặt hàng và một mặt hàng có thể được đặt/giao cho nhiều khách hàng.
ERD text: KHÁCH HÀNG (Mã khách PK, Họ tên, Địa chỉ) || (đặt) M:N || (giao) M:N HÀNG (Mã hàng PK, Tên hàng, ĐVT, Đơn giá) Thuộc tính liên kết đặt: Số HĐ đặt, Ngày đặt, Số lượng đặt Thuộc tính liên kết giao: Số HĐ giao, Ngày giao, Địa chỉ giao, Số lượng giao
Ví dụ: Khách hàng mã KH01 đặt 2 mặt hàng son và kem; cùng mặt hàng son có thể được giao cho nhiều khách khác nhau.
Bài tập 2_2 - Công ty dịch vụ thể dục thể thao ABC
Bước 1 - Xác định thuộc tính: Từ 3 mẫu hồ sơ: Số khu vực, Tên khu vực, Địa chỉ, Mã dịch vụ, Tên dịch vụ, Đơn giá/Giờ, Số thẻ, Họ tên thành viên, Ngày sinh, Địa chỉ, Năm đăng ký, Số phiếu, Khu vực số, Bắt đầu, Kết thúc.
Bước 2 - Kiểu thực thể, thuộc tính, khóa:
- KHU VỰC(Số khu vực, Tên khu vực, Địa chỉ) - khóa: Số khu vực.
- DỊCH VỤ(Mã dịch vụ, Tên dịch vụ) - khóa: Mã dịch vụ.
- THÀNH VIÊN(Số thẻ, Họ tên, Ngày sinh, Địa chỉ, Năm đăng ký) - khóa: Số thẻ.
Bước 3 - Kiểu liên kết:
- Liên kết cung cấp/quảng cáo giữa KHU VỰC và DỊCH VỤ (M:N) với thuộc tính Đơn giá/Giờ.
- Liên kết sử dụng ba ngôi giữa THÀNH VIÊN, DỊCH VỤ, KHU VỰC với thuộc tính Số phiếu, Giờ bắt đầu, Giờ kết thúc.
Bước 4 - Bản số: Một khu vực cung cấp nhiều dịch vụ, một dịch vụ có thể có ở nhiều khu vực (M:N). Một thành viên có thể sử dụng nhiều dịch vụ ở nhiều khu vực.
ERD text: KHU VỰC (Số khu vực PK, Tên khu vực, Địa chỉ) || (cung cấp) M:N || (đơn giá/giờ) DỊCH VỤ (Mã DV PK, Tên DV) || (sử dụng) ternary || THÀNH VIÊN (Số thẻ PK, Họ tên, Ngày sinh, Địa chỉ, Năm ĐK) Thuộc tính liên kết sử dụng: Số phiếu, Bắt đầu, Kết thúc
Bài tập 2_3 - Quản lý điểm sinh viên (bản 1)
Thực thể và thuộc tính:
- SINH VIÊN(Mã SV, Họ tên, Ngày sinh, Giới tính, Nơi sinh, Hộ khẩu) - khóa: Mã SV.
- KHOA(Mã khoa, Tên khoa) - khóa: Mã khoa.
- LỚP HỌC PHẦN(Mã lớp, Tên lớp) - khóa: Mã lớp.
- HỌC PHẦN(Mã HP, Tên HP, Số tín chỉ) - khóa: Mã HP.
- GIẢNG VIÊN(Mã GV, Họ tên, Học vị) - khóa: Mã GV.
Liên kết và bản số:
- SINH VIÊN thuộc KHOA: N:1 (nhiều sinh viên - một khoa).
- LỚP HỌC PHẦN thuộc KHOA: N:1.
- GIẢNG VIÊN thuộc KHOA: N:1.
- LỚP HỌC PHẦN thuộc HỌC PHẦN: N:1 (nhiều lớp - một học phần).
- GIẢNG VIÊN phân công giảng dạy LỚP HỌC PHẦN: 1:N (một giảng viên - nhiều lớp).
- SINH VIÊN đăng ký LỚP HỌC PHẦN: M:N với thuộc tính Điểm số, Điểm chữ.
ERD text: SINH VIÊN(Mã SV PK, Họ tên, Ngày sinh, Giới tính, Nơi sinh, Hộ khẩu) --thuộc--> KHOA(Mã khoa PK, Tên khoa) [N:1] LỚP HP(Mã lớp PK, Tên lớp) --thuộc--> KHOA [N:1] LỚP HP --thuộc--> HỌC PHẦN(Mã HP PK, Tên HP, Số tín chỉ) [N:1] GIẢNG VIÊN(Mã GV PK, Họ tên, Học vị) --thuộc--> KHOA [N:1] LỚP HP --phân công--> GIẢNG VIÊN [N:1] SINH VIÊN (đăng ký) LỚP HP [M:N]: Điểm số, Điểm chữ
Bài tập 2_4 - Công ty (nhân viên, phòng ban, đề án, thân nhân)
Thực thể và thuộc tính:
- NHÂN VIÊN(Mã NV, Họ tên, Ngày sinh, Giới tính, Lương) - khóa: Mã NV.
- PHÒNG BAN(Mã phòng, Tên phòng) - khóa: Mã phòng.
- ĐỀ ÁN(Mã đề án, Tên đề án, Địa điểm) - khóa: Mã đề án.
- THÂN NHÂN (thực thể yếu, khóa từng phần Mã thân nhân, Họ tên, Ngày sinh, Giới tính, Quan hệ) - chủ sở hữu: NHÂN VIÊN.
Liên kết và bản số:
- NHÂN VIÊN thuộc PHÒNG BAN: N:1.
- NHÂN VIÊN làm TRƯỞNG PHÒNG của PHÒNG BAN: 1:1 với thuộc tính Ngày nhận chức.
- PHÒNG BAN chủ trì ĐỀ ÁN: 1:N.
- NHÂN VIÊN tham gia ĐỀ ÁN: M:N với thuộc tính Số giờ làm việc.
- NHÂN VIÊN có THÂN NHÂN: 1:N (liên kết nhận dạng, thực thể yếu).
ERD text: NHÂN VIÊN(Mã NV PK, Họ tên, Ngày sinh, Giới tính, Lương) --thuộc--> PHÒNG BAN(Mã phòng PK, Tên phòng) [N:1] --quản lý (trưởng phòng)--> PHÒNG BAN [1:1], Ngày nhận chức PHÒNG BAN --chủ trì--> ĐỀ ÁN(Mã ĐA PK, Tên ĐA, Địa điểm) [1:N] NHÂN VIÊN (tham gia) ĐỀ ÁN [M:N], Số giờ NHÂN VIÊN (có) THÂN NHÂN(Mã TN, Họ tên, Ngày sinh, Giới tính, Quan hệ) [1:N, weak]
Bài tập 2_5 - Siêu thị (nhà cung cấp, gian hàng, khách hàng)
Thực thể và thuộc tính:
- NHÀ CUNG CẤP(Số hiệu NCC, Tên NCC, Địa chỉ, SĐT) - khóa: Số hiệu NCC.
- MẶT HÀNG(Mã hàng, Tên hàng, Màu sắc, Trọng lượng, ĐVT, Số lượng tồn) - khóa: Mã hàng.
- GIAN HÀNG(Mã gian, Tên gian) - khóa: Mã gian.
- NHÂN VIÊN(Mã NV, Họ tên, Lương) - khóa: Mã NV.
- KHÁCH HÀNG(Mã KH, Họ tên, Địa chỉ) - khóa: Mã KH.
- THÂN NHÂN (thực thể yếu, Mã TN, Họ tên, Ngày sinh, Giới tính, Quan hệ) - chủ sở hữu: NHÂN VIÊN.
Liên kết và bản số:
- NHÀ CUNG CẤP cung cấp MẶT HÀNG: M:N với thuộc tính Đơn giá, Số lượng, Số HĐ, Ngày bán.
- GIAN HÀNG bán MẶT HÀNG: 1:N (một gian - nhiều mặt hàng; mỗi mặt hàng một gian).
- NHÂN VIÊN tư vấn cho GIAN HÀNG: 1:N (một nhân viên - nhiều gian).
- KHÁCH HÀNG mua MẶT HÀNG: M:N với thuộc tính Mã HĐ, Ngày mua, Đơn giá, Số lượng.
- NHÂN VIÊN có THÂN NHÂN: 1:N (thực thể yếu).
ERD text: NCC(Số hiệu NCC PK, Tên NCC, Địa chỉ, SĐT) (cung cấp) M:N MẶT HÀNG(Mã hàng PK, Tên hàng, Màu sắc, Trọng lượng, ĐVT, Số lượng tồn) thuộc tính liên kết: Đơn giá, Số lượng, Số HĐ, Ngày bán GIAN HÀNG(Mã gian PK, Tên gian) --bán--> MẶT HÀNG [1:N] NHÂN VIÊN(Mã NV PK, Họ tên, Lương) --tư vấn--> GIAN HÀNG [1:N] KHÁCH HÀNG(Mã KH PK, Họ tên, Địa chỉ) (mua) MẶT HÀNG [M:N] thuộc tính liên kết: Mã HĐ, Ngày mua, Đơn giá, Số lượng NHÂN VIÊN (có) THÂN NHÂN(Mã TN, Họ tên, Ngày sinh, Giới tính, Quan hệ) [1:N, weak]
Bài tập tình huống - Hệ thống thương mại điện tử kết hợp mạng xã hội
Hệ thống chỉ dùng SQL không còn phù hợp khi số người dùng tăng nhanh. Đề xuất tổ chức dữ liệu theo mô hình polyglot persistence:
- SQL (RDBMS): quản lý người dùng, đơn hàng, thanh toán - dữ liệu cần ACID và nhất quán.
- Graph DB (Neo4j): lưu mối quan hệ người dùng và gợi ý sản phẩm theo quan hệ/hành vi.
- Document/NoSQL (MongoDB): hồ sơ người dùng linh hoạt, catalog sản phẩm.
- Wide-column/Time-series (Cassandra): lưu hành vi người dùng (lượt xem, thích, bình luận) khối lượng lớn.
- Redis: cache và session để tăng tốc.
- Elasticsearch: tìm kiếm sản phẩm và nội dung.
Kết hợp nhiều mô hình dữ liệu giúp cân bằng nhất quán, hiệu năng và khả năng mở rộng.
Hướng giải mẫu - Bài tập 2_1 (4 bước)
Phần 1: Phát biểu bài toán - Cửa hàng mỹ phẩm với hóa đơn đặt hàng và hóa đơn bán/giao hàng.
Bước 1: Xác định thuộc tính - Liệt kê và chính xác hóa tên thuộc tính từ hai hóa đơn (Số HĐ đặt/giao, Mã khách, Họ tên khách, Địa chỉ, Ngày đặt/giao, Địa chỉ giao, Mã hàng, Tên hàng, ĐVT, Đơn giá, Số lượng đặt/giao, ...).
Bước 2: Xác định kiểu thực thể, thuộc tính, khóa
- KHÁCH HÀNG(Mã khách, Họ tên khách, Địa chỉ).
- HÀNG(Mã hàng, Tên hàng, ĐVT, Đơn giá).
Bước 3: Xác định kiểu liên kết, thuộc tính liên kết
- Liên kết đặt: Số HĐ đặt, Ngày đặt, Số lượng đặt.
- Liên kết giao: Số HĐ giao, Ngày giao, Địa chỉ giao, Số lượng giao.
Bước 4: Vẽ mô hình thực thể liên kết mở rộng - Hai thực thể và hai liên kết nhiều nhiều, mỗi liên kết mang thuộc tính riêng.
ERD text: KHÁCH HÀNG (Mã khách PK, Họ tên, Địa chỉ) || (đặt) M:N || (giao) M:N HÀNG (Mã hàng PK, Tên hàng, ĐVT, Đơn giá)
1. Thuộc tính và miền giá trị
Thuộc tính là một đặc trưng dùng để mô tả một khía cạnh của đối tượng trong thế giới thực được lưu trữ trong cơ sở dữ liệu. Mỗi thuộc tính có tên thuộc tính và miền giá trị, trong đó miền giá trị bao gồm kiểu dữ liệu và phạm vi giá trị hợp lệ. Về mặt toán học, mỗi thuộc tính A_i được gắn với một miền giá trị Dom(A_i), với Dom(A_i) ≠ ∅. Thuộc tính được hiểu như một biến nhận giá trị trong một tập xác định (miền).
Ví dụ, cho quan hệ SINH_VIÊN với các thuộc tính MãSV, HọTên, NgàySinh, GiớiTính, ta có Dom(MãSV) = Text(10), Dom(HọTên) = Text(100), Dom(NgàySinh) = Date(8), Dom(GiớiTính) = Logic(1). Các miền này xác định rõ kiểu và phạm vi dữ liệu hợp lệ cho từng thuộc tính.
2. Bộ (tuple)
Một bộ là một bản ghi trong quan hệ, biểu diễn một đối tượng cụ thể. Mỗi bộ là một ánh xạ từ tập thuộc tính sang các giá trị cụ thể trong miền tương ứng. Một bộ t trên tập thuộc tính U là hàm ánh xạ t: U → ⋃_{A∈U} Dom(A), sao cho ∀A ∈ U, t(A) ∈ Dom(A). Cách viết tương đương: nếu U = {A1, A2, ..., An} thì t = (a1, a2, ..., an) với ai ∈ Dom(Ai).
Ví dụ, trong quan hệ SINH_VIÊN, bộ (4451050002, Nguyễn Văn A, 10/10/02, 1) mô tả thông tin của sinh viên có mã sinh viên 4451050002. Mỗi giá trị trong bộ phải thuộc miền của thuộc tính tương ứng.
3. Quan hệ (relation)
Một quan hệ R trên tập thuộc tính U = {A1, A2, ..., An} là một tập hữu hạn các bộ, tức là R ⊆ Dom(A1) × Dom(A2) × ... × Dom(An), hay nói cách khác R = { t | t là một bộ trên U }. Trực quan, mỗi quan hệ R(U) là một bảng: mỗi cột là một thuộc tính, mỗi dòng là một bộ. Ký hiệu t[U] là một bộ trên tập thuộc tính U.
| MãSV | HọTên | NgàySinh | GiớiTính |
|---|---|---|---|
| 4451050002 | Nguyễn Văn A | 10/10/02 | 1 |
| 4451130014 | Hồ Ngọc Hà | 25/11/01 | 0 |
| 4454030114 | Tô Ngọc Long | 11/02/02 | 1 |
| 4451050123 | Vũ Như Cẩn | 24/12/01 | 1 |
Tóm tắt và lời khuyên: thuộc tính là đơn vị mô tả nhỏ nhất của dữ liệu; bộ biểu diễn một cá thể cụ thể trong thế giới thực; quan hệ chỉ lưu trữ dữ liệu, không lưu trữ cấu trúc; trong một quan hệ không cho phép tồn tại hai bộ hoàn toàn giống nhau; thứ tự thuộc tính hay bộ không mang ý nghĩa trong mô hình quan hệ.
4. Lược đồ quan hệ (schema)
Lược đồ quan hệ mô tả cấu trúc logic của một quan hệ trong cơ sở dữ liệu, bao gồm tên quan hệ, tập các thuộc tính và các ràng buộc tham chiếu trên các thuộc tính đó. Lược đồ quan hệ không chứa dữ liệu cụ thể, mà chỉ mô tả khuôn dạng (schema) của dữ liệu. Trong lý thuyết cơ sở dữ liệu, lược đồ quan hệ thường được biểu diễn R(U, F), trong đó R là tên quan hệ, U là tập thuộc tính, F là tập các ràng buộc (phụ thuộc hàm) xác định trên U. Trong một cơ sở dữ liệu sẽ bao gồm một hay nhiều lược đồ quan hệ.
| Tiêu chí | Lược đồ quan hệ | Quan hệ |
|---|---|---|
| Khái niệm | Mô tả cấu trúc logic của dữ liệu | Tập dữ liệu cụ thể tuân theo lược đồ |
| Bản chất | Định nghĩa (schema) | Thể hiện (instance) |
| Thành phần | Tên quan hệ, tập thuộc tính, ràng buộc | Tập các bộ (tuple) |
| Mức trừu tượng | Mức thiết kế | Mức vận hành |
| Khóa | Được xác định trên lược đồ | Giá trị khóa xuất hiện trong dữ liệu |
| Ràng buộc | Định nghĩa ràng buộc miền, khóa, tham chiếu | Phải tuân thủ các ràng buộc |
Lược đồ quan hệ là cơ sở của thiết kế cơ sở dữ liệu; mọi ràng buộc về khóa, miền giá trị và tham chiếu đều được xác định trên lược đồ; lược đồ quyết định cách lưu trữ và truy vấn dữ liệu.
5. Các ký hiệu truyền thống
- Ký hiệu lược đồ quan hệ: R, S, T,... là tên quan hệ (viết hoa); R(U) là lược đồ quan hệ R với tập thuộc tính U; R(U, F) là lược đồ quan hệ R với tập thuộc tính U và tập phụ thuộc hàm F xác định trên U.
- Ký hiệu thuộc tính: chữ Latin hoa đầu bảng A, B, C,... cho thuộc tính đơn; A_i là thuộc tính thứ i; chữ Latin hoa cuối bảng U, V,..., X, Y, Z cho tập thuộc tính; U = ABC hoặc U = {A, B, C} biểu diễn các phần tử trong một tập thuộc tính.
- Ký hiệu bộ của quan hệ: các bộ biểu diễn bằng chữ cái Latin thường (có thể có chỉ số) t, s, t1, t2,...; với mỗi bộ t trong quan hệ R(U) và mỗi tập con thuộc tính X ⊆ U, ký hiệu t[X] hoặc t.X là hạn chế của bộ t trên tập thuộc tính X.
- Quy ước khác: tên quan hệ chữ in hoa (SINH_VIÊN); tên thuộc tính chữ cái đầu viết hoa hoặc thường (MãSV, HọTên); khóa của lược đồ quan hệ được gạch chân; tập thuộc tính tham chiếu in nghiêng.
Ví dụ, với lược đồ quan hệ SINH_VIÊN(MãSV, HọTên, NgàySinh, GiớiTính), ta có U = {MãSV, HọTên, NgàySinh, GiớiTính, MãHP}; t = (4451150001, Nguyễn Văn A, 12/12/01, 1); X = {HọTên, NgàySinh} ⊆ U; t.X = t[X] = (Nguyễn Văn A, 12/12/01).
1. Siêu khóa (superkey)
Siêu khóa là một tập con K ⊆ U của các thuộc tính sao cho không có hai bộ nào trong quan hệ có cùng giá trị trên K. Hình thức: ∀t1, t2 ∈ R, t1[K] = t2[K] ⇒ t1 = t2. Siêu khóa đảm bảo tính duy nhất của bộ. Tập tất cả thuộc tính U luôn là một siêu khóa, nhưng thường không tối thiểu và không thuận tiện để sử dụng.
2. Khóa ứng viên (candidate key)
Khóa ứng viên là siêu khóa tối thiểu: không tồn tại K' ⊂ K sao cho K' cũng là siêu khóa. Điều kiện tối thiểu: K xác định được giá trị của mọi thuộc tính Ai (i = 1..n), và không tồn tại K' ⊂ K có thể xác định được giá trị của mọi Ai. Một quan hệ có thể có nhiều khóa ứng viên; mỗi khóa ứng viên đều có khả năng phân biệt duy nhất các bộ.
3. Khóa chính (primary key)
Khóa chính là khóa ứng viên được chọn để đại diện cho quan hệ, thường được gạch chân trong lược đồ. Khóa chính phải duy nhất và không được rỗng (NULL) theo ràng buộc toàn vẹn thực thể. Khi có nhiều khóa ứng viên, ưu tiên chọn khóa đơn giản, ổn định, ngắn gọn và ít thay đổi theo thời gian. Ví dụ, trong quan hệ SINH_VIÊN, MãSV là khóa chính.
4. Khóa ngoại (foreign key)
Khóa ngoại là tập thuộc tính trong quan hệ R tham chiếu đến tập thuộc tính khóa (thường là khóa chính) của quan hệ S. Điều kiện: cùng miền giá trị; giá trị của khóa ngoại phải tồn tại trong quan hệ được tham chiếu (hoặc NULL nếu cho phép). Ràng buộc tham chiếu đảm bảo tính nhất quán giữa các quan hệ. Một số nhận xét:
- Trong một quan hệ, một thuộc tính có thể vừa tham gia thuộc tính khóa, vừa tham gia thuộc tính tham chiếu.
- Tập thuộc tính tham chiếu chỉ tham chiếu đến tập thuộc tính khóa trên cùng một cơ sở dữ liệu.
- Có thể có nhiều thuộc tính tham chiếu cùng tham chiếu đến tập thuộc tính khóa.
5. Ví dụ xác định khóa và khóa ngoại
Cho các quan hệ: SINH_VIÊN(MãSV, HọTên, NgàySinh, GiớiTính, MãHP), HỌC_PHẦN(MãHP, TênHP, SốTC), SV_HP(MãSV, MãHP, Ngày_Đăng_Ký, ĐiểmHP).
- Quan hệ SINH_VIÊN có khóa là MãSV; quan hệ HỌC_PHẦN có khóa là MãHP; quan hệ SV_HP có khóa là (MãSV, MãHP).
- Ràng buộc tham chiếu: SINH_VIÊN.MãHP tham chiếu đến khóa HỌC_PHẦN.MãHP; SV_HP.MãSV tham chiếu đến khóa SINH_VIÊN.MãSV và SV_HP.MãHP tham chiếu đến khóa HỌC_PHẦN.MãHP.
Khóa có thể là đơn (một thuộc tính) hoặc tổ hợp (nhiều thuộc tính). Khóa tổ hợp thường xuất hiện trong quan hệ liên kết nhiều-nhiều, nơi không có thuộc tính đơn nào đủ để phân biệt duy nhất các bộ.
1. Ràng buộc miền giá trị (domain constraint)
Ràng buộc miền giá trị yêu cầu mọi giá trị của một thuộc tính phải thuộc miền giá trị xác định của thuộc tính đó: ∀t ∈ R, t[A] ∈ Dom(A). Ràng buộc này đảm bảo tính hợp lệ của dữ liệu, ngăn chặn giá trị sai kiểu hoặc sai phạm vi. Ví dụ, trong quan hệ SINH_VIÊN(MãSV, Tuổi, GiớiTính): Dom(Tuổi) = { x ∈ ℕ | 18 ≤ x ≤ 60 }, Dom(GiớiTính) = {1, 0}.
2. Ràng buộc khóa (key constraint)
Ràng buộc khóa đảm bảo mỗi bộ trong quan hệ được phân biệt duy nhất bởi giá trị khóa: ∀t1, t2 ∈ R, t1[K] = t2[K] ⇒ t1 = t2. Khóa K xác định được giá trị của Ai (i = 1..n), và không tồn tại K' ⊂ K có thể xác định được giá trị của Ai. Ý nghĩa: tránh dữ liệu trùng lặp và tạo nền tảng cho việc liên kết giữa các quan hệ. Ví dụ, trong quan hệ SINH_VIÊN(MãSV, HọTên, NgàySinh), hai bộ t1 = (SV01, Nguyễn Văn A, 10/10/02) và t2 = (SV01, Nguyễn Thị B, 25/11/01) là không hợp lệ vì cùng khóa MãSV.
3. Ràng buộc toàn vẹn thực thể (entity integrity)
Ràng buộc toàn vẹn thực thể yêu cầu giá trị khóa chính không được rỗng (NULL). Ví dụ, trong quan hệ SINH_VIÊN(MãSV, HọTên, NgàySinh) với khóa là MãSV, bộ t1 = (NULL, Nguyễn Văn A, 10/10/02) là không hợp lệ. Khóa chính phải tồn tại và duy nhất cho mỗi bộ, đảm bảo mỗi thực thể được nhận diện rõ ràng.
4. Ràng buộc tham chiếu (referential integrity)
Ràng buộc tham chiếu: một bộ trong quan hệ R, tại tập thuộc tính X nếu nhận giá trị từ tập thuộc tính Y của quan hệ S, ta gọi R tham chiếu S. Tập thuộc tính Y của S phải có cùng miền giá trị với tập thuộc tính X của R; giá trị của tập thuộc tính Y là một bộ t1 ∈ S bằng giá trị tập thuộc tính X của một bộ t2 ∈ R. Nói cách khác, giá trị của tập thuộc tính tham chiếu trong một quan hệ phải tồn tại trong tập thuộc tính khóa của quan hệ được tham chiếu. Ý nghĩa: đảm bảo tính nhất quán giữa các quan hệ.
- Trong một quan hệ, một thuộc tính có thể vừa tham gia thuộc tính khóa, vừa tham gia thuộc tính tham chiếu.
- Tập thuộc tính tham chiếu chỉ tham chiếu đến tập thuộc tính khóa trên cùng một cơ sở dữ liệu.
- Có thể có nhiều thuộc tính tham chiếu cùng tham chiếu đến tập thuộc tính khóa.
Ví dụ: quan hệ SINH_VIÊN(MãSV, HọTên, NgàySinh, MãHP) và HỌC_PHẦN(MãHP, TênHP, SốTC); ràng buộc tham chiếu: SINH_VIÊN.MãHP tham chiếu đến khóa HỌC_PHẦN.MãHP.
Ví dụ minh họa tổng hợp: SINH_VIÊN(MãSV, HọTên, NgàySinh, GiớiTính, MãHP), HỌC_PHẦN(MãHP, TênHP, SốTC), SV_HP(MãSV, MãHP, Ngày_Đăng_Ký, ĐiểmHP). Thuộc tính khóa: SINH_VIÊN có khóa MãSV; HỌC_PHẦN có khóa MãHP; SV_HP có khóa (MãSV, MãHP). Ràng buộc tham chiếu: SINH_VIÊN.MãHP tham chiếu HỌC_PHẦN.MãHP; SV_HP.MãSV tham chiếu SINH_VIÊN.MãSV và SV_HP.MãHP tham chiếu HỌC_PHẦN.MãHP.
5. Ba ràng buộc bổ trợ nhau
| Ràng buộc | Vai trò |
|---|---|
| Miền giá trị | Kiểm soát giá trị của từng thuộc tính, ngăn chặn dữ liệu sai ngay từ lúc nhập |
| Khóa | Kiểm soát bộ, tránh trùng lặp, tạo nền tảng liên kết |
| Tham chiếu | Kiểm soát mối quan hệ giữa các quan hệ, đảm bảo nhất quán |
Miền giá trị kiểm soát giá trị, khóa kiểm soát bộ, tham chiếu kiểm soát mối quan hệ giữa các quan hệ. Lời khuyên: xác định miền giá trị càng chặt chẽ càng tốt, chỉ cho phép các giá trị hợp lệ theo nghiệp vụ thực tế; mỗi quan hệ bắt buộc phải có ít nhất một khóa; ưu tiên chọn khóa đơn giản, ổn định và ngắn gọn; xác định rõ hướng tham chiếu giữa các quan hệ và ý nghĩa nghiệp vụ của mối liên kết. Việc thay đổi giá trị của các thuộc tính khóa, thuộc tính tham chiếu dễ vi phạm toàn vẹn tham chiếu và làm phát sinh lỗi dây chuyền, nên khi sửa hoặc xóa cần sử dụng điều kiện WHERE chính xác.
Mục tiêu và ý nghĩa
Các quy tắc chuyển đổi nhằm bảo toàn ngữ nghĩa của mô hình thực thể liên kết khi chuyển sang mô hình quan hệ, giảm dư thừa, tăng tính nhất quán và tối ưu cấu trúc dữ liệu. Việc áp dụng đúng các quy tắc này quyết định chất lượng thiết kế cơ sở dữ liệu quan hệ.
Quy tắc 1: Chuyển kiểu thực thể thành quan hệ
- Mỗi kiểu thực thể trong mô hình thực thể liên kết được chuyển thành một quan hệ trong mô hình quan hệ.
- Tên quan hệ trùng với tên kiểu thực thể.
- Các thuộc tính của kiểu thực thể trở thành các thuộc tính của quan hệ.
- Thuộc tính khóa của kiểu thực thể trở thành khóa của quan hệ.
Ví dụ: kiểu thực thể SINH VIÊN được chuyển thành quan hệ SINH_VIÊN(MãSV, HọVàTên, NgàySinh, GiớiTính).
Quy tắc 2: Kiểu liên kết 1-1
- Áp dụng quy tắc 1 để chuyển kiểu thực thể thành quan hệ.
- Đưa khóa của một quan hệ sang quan hệ còn lại làm thuộc tính tham chiếu.
- Các thuộc tính của kiểu liên kết (nếu có) đưa vào quan hệ chứa thuộc tính tham chiếu.
Ví dụ, giữa NHÂN VIÊN và TÀI KHOẢN có kiểu liên kết 1-1 "Có", vì mỗi nhân viên có đúng một tài khoản do đơn vị cấp. Áp dụng quy tắc 2:
- Quan hệ NHÂN_VIÊN(MãNV, HọVàTên).
- Quan hệ TÀI_KHOẢN(MãTK, TênĐăngNhập, MậtKhẩu, MãNV).
Trong quan hệ TÀI_KHOẢN, MãNV là khóa ngoại tham chiếu đến khóa NHÂN_VIÊN.MãNV. Giả sử kiểu liên kết có thuộc tính NgàyCấp, thuộc tính này được đưa vào quan hệ TÀI_KHOẢN.
Quy tắc 3: Kiểu liên kết 1-nhiều
- Áp dụng quy tắc 1 để chuyển kiểu thực thể thành quan hệ.
- Đưa khóa của quan hệ phía bên một sang quan hệ phía bên nhiều làm thuộc tính tham chiếu.
- Các thuộc tính của kiểu liên kết (nếu có) đưa vào quan hệ phía bên nhiều.
Ví dụ, giữa SINH VIÊN và KHOA có kiểu liên kết 1-nhiều "Thuộc", vì mỗi sinh viên thuộc một khoa và một khoa có nhiều sinh viên. Áp dụng quy tắc 3:
- Quan hệ KHOA(MãKhoa, TênKhoa).
- Quan hệ SINH_VIÊN(MãSV, HọVàTên, NgàySinh, MãKhoa).
Quan hệ SINH_VIÊN nhận thuộc tính khóa MãKhoa của quan hệ KHOA làm thuộc tính tham chiếu. Giả sử kiểu liên kết có thuộc tính NgàyNhậpKhoa, thuộc tính này được đưa vào quan hệ SINH_VIÊN.
Ghi chú về liên kết nhiều-nhiều
Liên kết nhiều-nhiều không thuộc ba quy tắc trên nhưng thường được xử lý bằng cách tạo một quan hệ mới (quan hệ liên kết) với khóa tổ hợp gồm khóa của các kiểu thực thể tham gia, cùng các thuộc tính riêng của kiểu liên kết; sau đó nối với các kiểu thực thể gốc bằng liên kết một-nhiều. Ví dụ, liên kết "Đăng ký" giữa SINH VIÊN và KHÓA HỌC có thuộc tính riêng Thời gian đăng ký và Điểm trung bình, tạo quan hệ SV_KH(MãSV, MãKH, ThờiGianĐăngKý, ĐiểmTB) với khóa (MãSV, MãKH), trong đó MãSV tham chiếu SINH_VIÊN.MãSV và MãKH tham chiếu KHÓA_HỌC.MãKH.
Ví dụ minh họa: Hệ thống quản lý đào tạo
Xuất phát từ mô hình thực thể liên kết, áp dụng các quy tắc chuyển đổi để thu được mô hình quan hệ cho hệ thống quản lý đào tạo đại học.
1. Chuyển kiểu thực thể thành quan hệ
- KHOA(MãKhoa, TênKhoa)
- SINH_VIÊN(MãSV, HọVàTên, NgàySinh, GiớiTính)
- GIẢNG_VIÊN(MãGV, HọVàTên, Khoa, HọcVị)
- KHÓA_HỌC(MãKH, TênKH, SốTC)
- LỚP_HỌC(MãLH, PhòngHọc, CaHọc)
2. Liên kết 1-nhiều: Khoa - Sinh viên
KHOA 1 - n SINH_VIÊN "Thuộc". Đưa khóa MãKhoa của KHOA vào SINH_VIÊN làm khóa ngoại:
SINH_VIÊN(MãSV, HọVàTên, NgàySinh, GiớiTính, MãKhoa)
3. Liên kết 1-1: Nhân viên - Tài khoản (minh họa)
NHÂN_VIÊN(MãNV, HọVàTên); TÀI_KHOẢN(MãTK, TênĐăngNhập, MậtKhẩu, MãNV, NgàyCấp), trong đó MãNV là khóa ngoại tham chiếu NHÂN_VIÊN.MãNV.
4. Liên kết nhiều-nhiều: Sinh viên - Khóa học
Liên kết "Đăng ký" có thuộc tính riêng Thời gian đăng ký và Điểm trung bình. Tạo quan hệ SV_KH:
SV_KH(MãSV, MãKH, ThờiGianĐăngKý, ĐiểmTB), với MãSV tham chiếu SINH_VIÊN.MãSV và MãKH tham chiếu KHÓA_HỌC.MãKH.
5. Lược đồ quan hệ tổng hợp
| Quan hệ | Thuộc tính (khóa gạch chân, khóa ngoại in nghiêng) |
|---|---|
| KHOA | MãKhoa, TênKhoa |
| SINH_VIÊN | MãSV, HọVàTên, NgàySinh, GiớiTính, MãKhoa |
| GIẢNG_VIÊN | MãGV, HọVàTên, Khoa, HọcVị |
| KHÓA_HỌC | MãKH, TênKH, SốTC |
| SV_KH | MãSV, MãKH, ThờiGianĐăngKý, ĐiểmTB |
Kiểm tra mô hình: mỗi quan hệ có khóa; các khóa ngoại tham chiếu đúng; thuộc tính riêng của liên kết được bảo toàn; không còn liên kết nhiều-nhiều trực tiếp. Các thao tác thêm, sửa, xóa trên các quan hệ phải tuân thủ ràng buộc miền giá trị, khóa và tham chiếu.
Bài tập 3_1 - Chuyển đổi hệ thống mua bán mỹ phẩm
Ngữ cảnh nghiệp vụ: Cửa hàng mỹ phẩm có hai loại hồ sơ: hóa đơn đặt hàng (Số HĐ đặt, Mã khách, Họ tên khách, Địa chỉ, Ngày đặt, danh sách mặt hàng) và hóa đơn bán/giao hàng (Số HĐ giao, Mã khách, Họ tên khách, Địa chỉ, Địa chỉ giao, Ngày giao, danh sách mặt hàng).
1. Mô hình ER kinh điển:
- KHACH_HANG(MaKhach, HoTenKhach, DiaChi) - thực thể mạnh.
- HANG(MaHang, TenHang, DVT, DonGia) - thực thể mạnh.
- HOA_DON_DAT(SoHDDat, NgayDat, MaKhach) - liên kết 1-n giữa khách hàng và đơn đặt.
- HOA_DON_GIAO(SoHDGiao, NgayGiao, DiaChiGiao, MaKhach) - liên kết 1-n giữa khách hàng và đơn giao.
- Liên kết n-n CHI_TIET_DAT_HANG giữa HOA_DON_DAT và HANG, thuộc tính SoLuongDat.
- Liên kết n-n CHI_TIET_GIAO_HANG giữa HOA_DON_GIAO và HANG, thuộc tính SoLuongGiao.
2. Áp dụng quy tắc chuyển đổi:
- Quy tắc 1 & 3: Chuyển các thực thể mạnh thành quan hệ; đưa MaKhach từ KHACH_HANG sang HOA_DON_DAT và HOA_DON_GIAO làm khóa ngoại.
- Quy tắc 4: Tạo quan hệ CHI_TIET_DAT_HANG và CHI_TIET_GIAO_HANG, khóa chính là tổ hợp (SoHDDat, MaHang) và (SoHDGiao, MaHang), kèm khóa ngoại tới hóa đơn và hàng.
3. Lược đồ quan hệ kết quả:
1. KHACH_HANG (MaKhach, HoTenKhach, DiaChi) - Khóa chính: MaKhach 2. HANG (MaHang, TenHang, DVT, DonGia) - Khóa chính: MaHang 3. HOA_DON_DAT (SoHDDat, NgayDat, MaKhach) - Khóa chính: SoHDDat - Khóa ngoại: MaKhach tham chiếu KHACH_HANG(MaKhach) 4. CHI_TIET_DAT_HANG (SoHDDat, MaHang, SoLuongDat) - Khóa chính: (SoHDDat, MaHang) - Khóa ngoại: SoHDDat tham chiếu HOA_DON_DAT(SoHDDat) - Khóa ngoại: MaHang tham chiếu HANG(MaHang) 5. HOA_DON_GIAO (SoHDGiao, NgayGiao, DiaChiGiao, MaKhach) - Khóa chính: SoHDGiao - Khóa ngoại: MaKhach tham chiếu KHACH_HANG(MaKhach) 6. CHI_TIET_GIAO_HANG (SoHDGiao, MaHang, SoLuongGiao) - Khóa chính: (SoHDGiao, MaHang) - Khóa ngoại: SoHDGiao tham chiếu HOA_DON_GIAO(SoHDGiao) - Khóa ngoại: MaHang tham chiếu HANG(MaHang)
4. Bảng quan hệ (khóa chính, khóa ngoại):
| Quan hệ | Khóa chính | Khóa ngoại |
|---|---|---|
| KHACH_HANG | MaKhach | - |
| HANG | MaHang | - |
| HOA_DON_DAT | SoHDDat | MaKhach tham chiếu KHACH_HANG(MaKhach) |
| CHI_TIET_DAT_HANG | (SoHDDat, MaHang) | SoHDDat tham chiếu HOA_DON_DAT(SoHDDat); MaHang tham chiếu HANG(MaHang) |
| HOA_DON_GIAO | SoHDGiao | MaKhach tham chiếu KHACH_HANG(MaKhach) |
| CHI_TIET_GIAO_HANG | (SoHDGiao, MaHang) | SoHDGiao tham chiếu HOA_DON_GIAO(SoHDGiao); MaHang tham chiếu HANG(MaHang) |
Bài tập 3_2 - Chuyển đổi hệ thống dịch vụ thể dục thể thao ABC
Ngữ cảnh nghiệp vụ: Công ty ABC kinh doanh dịch vụ thể dục thể thao, có ba hồ sơ: bảng quảng cáo dịch vụ theo khu vực, thẻ thành viên và phiếu sử dụng dịch vụ.
1. Mô hình ER kinh điển:
- KHU_VUC(MaKV, TenKV, DiaChi) - thực thể mạnh.
- DICH_VU(MaDV, TenDV) - thực thể mạnh.
- Liên kết n-n CUNG_CAP giữa KHU_VUC và DICH_VU, thuộc tính DonGiaGio.
- THANH_VIEN(SoThe, HoTen, NgaySinh, DiaChi, NamDangKy) - thực thể mạnh.
- PHIEU_SU_DUNG(SoPhieu, GioBatDau, GioKetThuc) - liên kết với thành viên và dịch vụ tại khu vực.
2. Áp dụng quy tắc chuyển đổi:
- Quy tắc 1: Chuyển THANH_VIEN, KHU_VUC, DICH_VU thành các quan hệ.
- Quy tắc 4: Tạo KHUVUC_DICHVU(MaKV, MaDV, DonGiaGio) cho liên kết nhiều-nhiều giữa khu vực và dịch vụ.
- Quy tắc 3: PHIEU_SU_DUNG nhận SoThe từ THANH_VIEN, cùng MaKV và MaDV đại diện cho dịch vụ tại địa điểm sử dụng.
3. Lược đồ quan hệ kết quả:
1. THANH_VIEN (SoThe, HoTen, NgaySinh, DiaChi, NamDangKy) - Khóa chính: SoThe 2. KHU_VUC (MaKV, TenKV, DiaChi) - Khóa chính: MaKV 3. DICH_VU (MaDV, TenDV) - Khóa chính: MaDV 4. KHUVUC_DICHVU (MaKV, MaDV, DonGiaGio) - Khóa chính: (MaKV, MaDV) - Khóa ngoại: MaKV tham chiếu KHU_VUC(MaKV) - Khóa ngoại: MaDV tham chiếu DICH_VU(MaDV) 5. PHIEU_SU_DUNG (SoPhieu, SoThe, MaKV, MaDV, GioBatDau, GioKetThuc) - Khóa chính: SoPhieu - Khóa ngoại: SoThe tham chiếu THANH_VIEN(SoThe) - Khóa ngoại: (MaKV, MaDV) tham chiếu KHUVUC_DICHVU(MaKV, MaDV)
4. Bảng quan hệ (khóa chính, khóa ngoại):
| Quan hệ | Khóa chính | Khóa ngoại |
|---|---|---|
| THANH_VIEN | SoThe | - |
| KHU_VUC | MaKV | - |
| DICH_VU | MaDV | - |
| KHUVUC_DICHVU | (MaKV, MaDV) | MaKV tham chiếu KHU_VUC(MaKV); MaDV tham chiếu DICH_VU(MaDV) |
| PHIEU_SU_DUNG | SoPhieu | SoThe tham chiếu THANH_VIEN(SoThe); (MaKV, MaDV) tham chiếu KHUVUC_DICHVU(MaKV, MaDV) |
Bài tập 3_3 - Chuyển đổi hệ thống quản lý điểm sinh viên
Ngữ cảnh nghiệp vụ: Quản lý điểm sinh viên đại học: sinh viên, khoa, giảng viên, học phần, lớp học phần và kết quả đăng ký học.
1. Mô hình ER kinh điển:
- KHOA(MaKhoa, TenKhoa) - thực thể mạnh.
- SINH_VIEN(MaSV, HoTen, NgaySinh, GioiTinh, NoiSinh, HoKhauThuongTru) - thực thể mạnh.
- GIANG_VIEN(MaGV, HoTen, HocVi) - thực thể mạnh.
- HOC_PHAN(MaHP, TenHP, SoTinChi) - thực thể mạnh.
- LOP_HOC_PHAN(MaLop, TenLop) - thực thể mạnh.
- Các liên kết 1-n: Khoa-Sinh viên (Thuộc), Khoa-Giảng viên (Trực thuộc), Khoa-Lớp (Quản lý), Học phần-Lớp, Giảng viên-Lớp (Giảng dạy).
- Liên kết n-n SINH_VIEN đăng ký LOP_HOC_PHAN với thuộc tính DiemSo, DiemChu.
2. Áp dụng quy tắc chuyển đổi:
- Quy tắc 3 (1-n): SINH_VIEN nhận MaKhoa; GIANG_VIEN nhận MaKhoa; LOP_HOC_PHAN nhận MaKhoa, MaHP và MaGV làm khóa ngoại.
- Quy tắc 4 (n-n): Tạo KET_QUA(MaSV, MaLop, DiemSo, DiemChu) với khóa chính (MaSV, MaLop).
3. Lược đồ quan hệ kết quả:
1. KHOA (MaKhoa, TenKhoa) - Khóa chính: MaKhoa 2. SINH_VIEN (MaSV, HoTen, NgaySinh, GioiTinh, NoiSinh, HoKhauThuongTru, MaKhoa) - Khóa chính: MaSV - Khóa ngoại: MaKhoa tham chiếu KHOA(MaKhoa) 3. GIANG_VIEN (MaGV, HoTen, HocVi, MaKhoa) - Khóa chính: MaGV - Khóa ngoại: MaKhoa tham chiếu KHOA(MaKhoa) 4. HOC_PHAN (MaHP, TenHP, SoTinChi) - Khóa chính: MaHP 5. LOP_HOC_PHAN (MaLop, TenLop, MaKhoa, MaHP, MaGV) - Khóa chính: MaLop - Khóa ngoại: MaKhoa tham chiếu KHOA(MaKhoa) - Khóa ngoại: MaHP tham chiếu HOC_PHAN(MaHP) - Khóa ngoại: MaGV tham chiếu GIANG_VIEN(MaGV) 6. KET_QUA (MaSV, MaLop, DiemSo, DiemChu) - Khóa chính: (MaSV, MaLop) - Khóa ngoại: MaSV tham chiếu SINH_VIEN(MaSV) - Khóa ngoại: MaLop tham chiếu LOP_HOC_PHAN(MaLop)
4. Bảng quan hệ (khóa chính, khóa ngoại):
| Quan hệ | Khóa chính | Khóa ngoại |
|---|---|---|
| KHOA | MaKhoa | - |
| SINH_VIEN | MaSV | MaKhoa tham chiếu KHOA(MaKhoa) |
| GIANG_VIEN | MaGV | MaKhoa tham chiếu KHOA(MaKhoa) |
| HOC_PHAN | MaHP | - |
| LOP_HOC_PHAN | MaLop | MaKhoa tham chiếu KHOA(MaKhoa); MaHP tham chiếu HOC_PHAN(MaHP); MaGV tham chiếu GIANG_VIEN(MaGV) |
| KET_QUA | (MaSV, MaLop) | MaSV tham chiếu SINH_VIEN(MaSV); MaLop tham chiếu LOP_HOC_PHAN(MaLop) |
Bài tập 3_4 - Chuyển đổi hệ thống quản lý đề án công ty
Ngữ cảnh nghiệp vụ: Công ty có nhân viên, phòng ban, đề án, phân công thực hiện và thân nhân (thực thể yếu).
1. Mô hình ER kinh điển:
- NHAN_VIEN(MaNV, HoTen, NgaySinh, GioiTinh, Luong) - thực thể mạnh.
- PHONG_BAN(MaPhong, TenPhong) - thực thể mạnh.
- DE_AN(MaDA, TenDA, DiaDiem) - thực thể mạnh.
- THAN_NHAN - thực thể yếu phụ thuộc NHAN_VIEN (MaTN, HoTenTN, NgaySinh, GioiTinh, QuanHe).
- Liên kết 1-n: PHONG_BAN - NHAN_VIEN (Làm việc tại).
- Liên kết 1-1: PHONG_BAN - NHAN_VIEN (Quản lý/Trưởng phòng) có thuộc tính NgayNhanChuc.
- Liên kết 1-n: PHONG_BAN - DE_AN (Chủ trì đề án).
- Liên kết n-n: NHAN_VIEN - DE_AN (Phân công thực hiện) có thuộc tính SoGio.
2. Áp dụng quy tắc chuyển đổi:
- Quy tắc 2 & 3: Đưa MaPhong vào NHAN_VIEN (thuộc phòng). Đưa TruongPhong_MaNV và NgayNhanChuc vào PHONG_BAN. Đưa MaPhong vào DE_AN (phòng chủ trì).
- Quy tắc 4: Tạo PHAN_CONG(MaNV, MaDA, SoGio).
- Quy tắc thực thể yếu: THAN_NHAN có khóa chính (MaNV, MaTN).
3. Lược đồ quan hệ kết quả:
1. PHONG_BAN (MaPhong, TenPhong, TruongPhong_MaNV, NgayNhanChuc) - Khóa chính: MaPhong - Khóa ngoại: TruongPhong_MaNV tham chiếu NHAN_VIEN(MaNV) 2. NHAN_VIEN (MaNV, HoTen, NgaySinh, GioiTinh, Luong, MaPhong) - Khóa chính: MaNV - Khóa ngoại: MaPhong tham chiếu PHONG_BAN(MaPhong) 3. DE_AN (MaDA, TenDA, DiaDiem, MaPhong) - Khóa chính: MaDA - Khóa ngoại: MaPhong tham chiếu PHONG_BAN(MaPhong) 4. PHAN_CONG (MaNV, MaDA, SoGio) - Khóa chính: (MaNV, MaDA) - Khóa ngoại: MaNV tham chiếu NHAN_VIEN(MaNV) - Khóa ngoại: MaDA tham chiếu DE_AN(MaDA) 5. THAN_NHAN (MaNV, MaTN, HoTenTN, NgaySinh, GioiTinh, QuanHe) - Khóa chính: (MaNV, MaTN) - Khóa ngoại: MaNV tham chiếu NHAN_VIEN(MaNV)
4. Bảng quan hệ (khóa chính, khóa ngoại):
| Quan hệ | Khóa chính | Khóa ngoại |
|---|---|---|
| PHONG_BAN | MaPhong | TruongPhong_MaNV tham chiếu NHAN_VIEN(MaNV) |
| NHAN_VIEN | MaNV | MaPhong tham chiếu PHONG_BAN(MaPhong) |
| DE_AN | MaDA | MaPhong tham chiếu PHONG_BAN(MaPhong) |
| PHAN_CONG | (MaNV, MaDA) | MaNV tham chiếu NHAN_VIEN(MaNV); MaDA tham chiếu DE_AN(MaDA) |
| THAN_NHAN | (MaNV, MaTN) | MaNV tham chiếu NHAN_VIEN(MaNV) |
Bài tập 3_5 - Chuyển đổi hệ thống quản lý siêu thị
Ngữ cảnh nghiệp vụ: Siêu thị làm việc với nhà cung cấp, mặt hàng, gian hàng, nhân viên, khách hàng, hóa đơn nhập, hóa đơn bán và thân nhân nhân viên.
1. Mô hình ER kinh điển:
- NHA_CUNG_CAP(MaNCC, TenNCC, DiaChi, SoDT) - thực thể mạnh.
- GIAN_HANG(MaGianHang, TenGianHang) - thực thể mạnh.
- NHAN_VIEN(MaNV, HoTen, Luong) - thực thể mạnh.
- MAT_HANG(MaHang, TenHang, MauSac, TrongLuong, DVT, SoLuongTon) - thực thể mạnh.
- KHACH_HANG(MaKH, HoTenKH, DiaChi) - thực thể mạnh.
- HOA_DON_NHAP(MaHDNhap, NgayNhap) - thực thể/hóa đơn nhập.
- HOA_DON_BAN(MaHDBan, NgayMua) - thực thể/hóa đơn bán.
- THAN_NHAN_NV - thực thể yếu phụ thuộc NHAN_VIEN.
- Liên kết 1-n: GIAN_HANG - MAT_HANG; KHACH_HANG - HOA_DON_BAN; NHA_CUNG_CAP - HOA_DON_NHAP.
- Liên kết n-n: NHAN_VIEN - GIAN_HANG; HOA_DON_NHAP - MAT_HANG; HOA_DON_BAN - MAT_HANG; NHA_CUNG_CAP - MAT_HANG (Cung ứng, DonGiaCungCap).
2. Áp dụng quy tắc chuyển đổi:
- Quy tắc 1, 2, 3: Chuyển các thực thể mạnh và thiết lập khóa ngoại cho các liên kết 1-n: MaGianHang vào MAT_HANG; MaKH vào HOA_DON_BAN; MaNCC vào HOA_DON_NHAP.
- Quy tắc 4: Tạo các bảng kết hợp n-n: CUNG_CAP, NV_GIANHANG, CHI_TIET_HD_NHAP, CHI_TIET_HD_BAN.
- Quy tắc thực thể yếu: THAN_NHAN_NV(MaNV, MaTN, ...).
3. Lược đồ quan hệ kết quả:
1. NHA_CUNG_CAP (MaNCC, TenNCC, DiaChi, SoDT)
- Khóa chính: MaNCC
2. GIAN_HANG (MaGianHang, TenGianHang)
- Khóa chính: MaGianHang
3. NHAN_VIEN (MaNV, HoTen, Luong)
- Khóa chính: MaNV
4. NV_GIANHANG (MaNV, MaGianHang)
- Khóa chính: (MaNV, MaGianHang)
- Khóa ngoại: MaNV tham chiếu NHAN_VIEN(MaNV)
- Khóa ngoại: MaGianHang tham chiếu GIAN_HANG(MaGianHang)
5. MAT_HANG (MaHang, TenHang, MauSac, TrongLuong, DVT, SoLuongTon, MaGianHang)
- Khóa chính: MaHang
- Khóa ngoại: MaGianHang tham chiếu GIAN_HANG(MaGianHang)
6. CUNG_CAP (MaNCC, MaHang, DonGiaCungCap)
- Khóa chính: (MaNCC, MaHang)
- Khóa ngoại: MaNCC tham chiếu NHA_CUNG_CAP(MaNCC)
- Khóa ngoại: MaHang tham chiếu MAT_HANG(MaHang)
7. HOA_DON_NHAP (MaHDNhap, NgayNhap, MaNCC)
- Khóa chính: MaHDNhap
- Khóa ngoại: MaNCC tham chiếu NHA_CUNG_CAP(MaNCC)
8. CHI_TIET_HD_NHAP (MaHDNhap, MaHang, SoLuongNhap)
- Khóa chính: (MaHDNhap, MaHang)
- Khóa ngoại: MaHDNhap tham chiếu HOA_DON_NHAP(MaHDNhap)
- Khóa ngoại: MaHang tham chiếu MAT_HANG(MaHang)
9. KHACH_HANG (MaKH, HoTenKH, DiaChi)
- Khóa chính: MaKH
10. HOA_DON_BAN (MaHDBan, NgayMua, MaKH)
- Khóa chính: MaHDBan
- Khóa ngoại: MaKH tham chiếu KHACH_HANG(MaKH)
11. CHI_TIET_HD_BAN (MaHDBan, MaHang, SoLuongBan, DonGiaBan)
- Khóa chính: (MaHDBan, MaHang)
- Khóa ngoại: MaHDBan tham chiếu HOA_DON_BAN(MaHDBan)
- Khóa ngoại: MaHang tham chiếu MAT_HANG(MaHang)
12. THAN_NHAN_NV (MaNV, MaTN, HoTenTN, NgaySinh, GioiTinh, QuanHe)
- Khóa chính: (MaNV, MaTN)
- Khóa ngoại: MaNV tham chiếu NHAN_VIEN(MaNV)
4. Bảng quan hệ (khóa chính, khóa ngoại):
| Quan hệ | Khóa chính | Khóa ngoại |
|---|---|---|
| NHA_CUNG_CAP | MaNCC | - |
| GIAN_HANG | MaGianHang | - |
| NHAN_VIEN | MaNV | - |
| NV_GIANHANG | (MaNV, MaGianHang) | MaNV tham chiếu NHAN_VIEN(MaNV); MaGianHang tham chiếu GIAN_HANG(MaGianHang) |
| MAT_HANG | MaHang | MaGianHang tham chiếu GIAN_HANG(MaGianHang) |
| CUNG_CAP | (MaNCC, MaHang) | MaNCC tham chiếu NHA_CUNG_CAP(MaNCC); MaHang tham chiếu MAT_HANG(MaHang) |
| HOA_DON_NHAP | MaHDNhap | MaNCC tham chiếu NHA_CUNG_CAP(MaNCC) |
| CHI_TIET_HD_NHAP | (MaHDNhap, MaHang) | MaHDNhap tham chiếu HOA_DON_NHAP(MaHDNhap); MaHang tham chiếu MAT_HANG(MaHang) |
| KHACH_HANG | MaKH | - |
| HOA_DON_BAN | MaHDBan | MaKH tham chiếu KHACH_HANG(MaKH) |
| CHI_TIET_HD_BAN | (MaHDBan, MaHang) | MaHDBan tham chiếu HOA_DON_BAN(MaHDBan); MaHang tham chiếu MAT_HANG(MaHang) |
| THAN_NHAN_NV | (MaNV, MaTN) | MaNV tham chiếu NHAN_VIEN(MaNV) |
1. Định nghĩa đại số quan hệ
Đại số quan hệ là ngôn ngữ truy vấn hình thức được xây dựng trên cơ sở lý thuyết tập hợp và logic quan hệ, dùng để thao tác và khai thác dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ. Ngôn ngữ này mô tả cách truy vấn dữ liệu thông qua một tập các phép toán toán học tác động trực tiếp lên các quan hệ (bảng), từ đó tạo ra các quan hệ mới làm kết quả trung gian hoặc kết quả cuối cùng.
2. Vai trò trong cơ sở dữ liệu quan hệ
- Là nền tảng lý thuyết cho các hệ quản trị cơ sở dữ liệu quan hệ hiện đại.
- Là cơ sở để xây dựng và tối ưu hóa các ngôn ngữ truy vấn bậc cao như SQL.
- Mọi truy vấn SQL đều có thể được ánh xạ về các biểu thức đại số quan hệ tương ứng trong quá trình tối ưu và thực thi truy vấn.
- Giúp người học hiểu rõ bản chất xử lý dữ liệu: kết hợp, lọc, chiếu và nối các quan hệ một cách chặt chẽ và chính xác.
3. Hai nhóm phép toán chính
| Nhóm phép toán | Các phép toán | Đặc điểm |
|---|---|---|
| Phép toán lý thuyết tập hợp | Hợp (∪), giao (∩), trừ (−), tích Descartes (×) | Kế thừa trực tiếp từ lý thuyết tập hợp; thường yêu cầu các quan hệ tương thích (khả hợp), trừ tích Descartes |
| Phép toán trên CSDL quan hệ | Chọn (σ), chiếu (π), kết nối (*), chia (÷) | Thiết kế riêng cho CSDL quan hệ, phản ánh trực tiếp nhu cầu truy vấn thực tế |
4. Quan hệ tương thích (khả hợp)
Giả thiết U = {A1, A2, ..., An} và V = {B1, B2, ..., Bn}. Hai quan hệ R(U) và S(V) được gọi là tương thích khi và chỉ khi U = V, tức là chúng có cùng cấu trúc lược đồ. Nói cách khác: số bậc (ngôi) của R và S bằng nhau; các thuộc tính tương ứng có cùng miền giá trị dom(Ai) = dom(Bi) (1 ≤ i ≤ n) và được sắp theo cùng một thứ tự. Điều kiện này là tiền đề để áp dụng hợp, giao, trừ.
5. Tính chất chung của phép toán
Mỗi phép toán trong đại số quan hệ nhận đầu vào là một hoặc nhiều quan hệ và trả về một quan hệ mới. Phép toán không làm thay đổi dữ liệu gốc mà tạo ra quan hệ kết quả, có thể dùng tiếp làm đầu vào cho phép toán khác để tạo thành biểu thức đại số quan hệ. Kết quả luôn là một tập các bộ không trùng lặp (tính chất quan hệ).
1. Phép hợp (∪)
Phép hợp kết hợp các bộ dữ liệu của hai quan hệ tương thích thành một quan hệ mới, mỗi bộ xuất hiện duy nhất một lần. Cho R(U) và S(U): R ∪ S = { t | t ∈ R hoặc t ∈ S }. Điều kiện áp dụng: R và S phải tương thích. Kết quả có cùng lược đồ với R và S, không có bộ trùng lặp.
| R | S | R ∪ S | |||
|---|---|---|---|---|---|
| A | B | A | B | A | B |
| a1 | b1 | a1 | b2 | a1 | b1 |
| a1 | b2 | a2 | b3 | a1 | b2 |
| a2 | b1 | a2 | b1 | ||
| a2 | b3 |
Ví dụ thực tế: SV_CNTT = SV_TTNT ∪ SV_KHMT gộp danh sách sinh viên công nghệ thông tin từ hai lớp chuyên ngành.
2. Phép trừ (−)
Phép trừ xác định các bộ xuất hiện trong quan hệ thứ nhất nhưng không xuất hiện trong quan hệ thứ hai: R − S = { t | t ∈ R và t ∉ S }. Điều kiện: R và S tương thích. Kết quả có cùng lược đồ với R, không có bộ trùng lặp. Phép trừ không giao hoán: R − S ≠ S − R.
| A | B | A | B | A | B | ||
| a1 | b1 | a1 | b2 | a1 | b1 | ||
| a1 | b2 | a2 | b3 | a2 | b1 | ||
| a2 | b1 |
Ví dụ thực tế: SV_HP = SV_ĐĂNG_KÝ − SV_HỦY xác định sinh viên còn đăng ký học phần sau khi hủy.
3. Phép giao (∩)
Phép giao xác định các bộ xuất hiện đồng thời trong cả hai quan hệ: R ∩ S = { t | t ∈ R và t ∈ S }. Điều kiện: R và S tương thích. Phép giao giao hoán và kết hợp. Trong SQL tương ứng INTERSECT.
| A | B | A | B | A | B | ||
| a1 | b1 | a1 | b2 | a1 | b2 | ||
| a1 | b2 | a2 | b3 | ||||
| a2 | b1 |
Ví dụ thực tế: SV_HP = SV_ĐĂNG_KÝ ∩ SV_ĐẠT xác định sinh viên đã đăng ký và đạt học phần.
4. Phép tích Descartes (×)
Phép tích Descartes kết hợp mọi bộ của quan hệ thứ nhất với mọi bộ của quan hệ thứ hai: R × S = { (a1,...,am,b1,...,bn) | (a1,...,am) ∈ R và (b1,...,bn) ∈ S }. Không yêu cầu tương thích. Số thuộc tính kết quả bằng tổng số thuộc tính của hai quan hệ; số bộ kết quả bằng tích số bộ của hai quan hệ.
| A | B | C | D | A | B | C | D | ||
| a1 | b1 | c1 | d2 | a1 | b1 | c1 | d2 | ||
| a1 | b2 | c2 | d3 | a1 | b1 | c2 | d3 | ||
| a2 | b1 | a1 | b2 | c1 | d2 | ||||
| a1 | b2 | c2 | d3 | ||||||
| a2 | b1 | c1 | d2 | ||||||
| a2 | b1 | c2 | d3 |
Ví dụ thực tế: SV_HP = SINH_VIÊN × HỌC_PHẦN tạo mọi cặp sinh viên - học phần, thường kết hợp với phép chọn để tạo kết nối có điều kiện.
5. Tóm tắt lời khuyên
- Chỉ áp dụng hợp, giao, trừ cho các quan hệ tương thích.
- Dùng giao và trừ để diễn đạt rõ các yêu cầu nghiệp vụ mang tính lọc - loại trừ.
- Hạn chế dùng tích Descartes trực tiếp trên quan hệ lớn, nên kết hợp với phép chọn hoặc kết nối để tránh bùng nổ dữ liệu.
- Xem các phép toán tập hợp như công cụ tư duy logic, hỗ trợ phân tích bài toán trước khi viết SQL.
1. Phép chọn (σ)
Phép chọn lọc các bộ trong một quan hệ dựa trên điều kiện xác định, không làm thay đổi lược đồ mà chỉ thay đổi tập các bộ. Ký hiệu R(E) hoặc σ_E(R). Định nghĩa hình thức: R(E) = { t | t ∈ R và E(t) = TRUE }. Có thể dùng các toán tử so sánh =, ≠, <, ≤, >, ≥ và kết hợp điều kiện bằng AND (∧), OR (∨), NOT (¬).
| A | B | C | D | A | B | C | D | |
| a1 | b1 | 1 | 2 | a1 | b1 | 1 | 2 | |
| a1 | b1 | 2 | 4 | a1 | b1 | 2 | 4 | |
| a3 | b3 | 5 | 7 | a2 | b1 | 6 | 4 | |
| a2 | b1 | 6 | 4 |
Điều kiện E = (D < 5). Ví dụ thực tế: SINH_VIÊN(Giới tính = 'Nữ') chọn sinh viên nữ.
2. Phép chiếu (π)
Phép chiếu trích ra một tập con các thuộc tính từ quan hệ và loại bỏ các bộ trùng lặp. Ký hiệu R[X] hoặc π_X(R), với X ⊆ U. Định nghĩa hình thức: R[X] = { t.X | t ∈ R }. Kết quả chỉ chứa các thuộc tính được chọn, số bộ luôn ít hơn hoặc bằng số bộ của R.
| A | B | C | D | A | B | A | C | ||
| a1 | b1 | c1 | d1 | a1 | b1 | a1 | c1 | ||
| a1 | b1 | c1 | d2 | a2 | b2 | a2 | c2 | ||
| a2 | b2 | c2 | d2 | a2 | c3 | ||||
| a2 | b2 | c3 | d3 |
T1 = R[AB], T2 = R[AC]. Ví dụ thực tế: SINH_VIÊN[Lớp, Khoa] lấy danh sách lớp và khoa.
3. Phép kết nối tự nhiên (*)
Phép kết nối tự nhiên kết hợp các bộ của hai quan hệ dựa trên điều kiện bằng nhau của các thuộc tính có cùng tên và loại bỏ các cột trùng lặp. Ký hiệu R * S. Yêu cầu U ∩ V ≠ ∅. Định nghĩa hình thức: R * S = { t, s.(V − X) | t, s ∈ (R × S), t.X = s.X }, với X = U ∩ V. Kết quả không lặp lại các thuộc tính dùng để nối.
| A | B | C | C | D | E | A | B | C | D | E | ||
| a1 | 1 | 1 | 1 | d1 | e1 | a1 | 1 | 1 | d1 | e1 | ||
| a2 | 2 | 1 | 2 | d2 | e2 | a2 | 2 | 1 | d1 | e1 | ||
| a3 | 2 | 2 | 3 | d3 | e3 | a3 | 2 | 2 | d2 | e2 |
Ví dụ thực tế: SV_LỚP = SINH_VIÊN * LỚP nối sinh viên với thông tin lớp theo Mã lớp.
4. Phép chia (÷)
Phép chia là phép toán dẫn xuất dùng để trả lời các truy vấn dạng 'với mọi' (FOR ALL). Cho R(X, Y) và S(Y), với Y là tập thuộc tính chung và X là tập thuộc tính còn lại của R. Định nghĩa: R ÷ S = { x | ∀y ∈ S, (x, y) ∈ R }. Kết quả có tập thuộc tính X, không chứa Y. Ý nghĩa: tìm những giá trị X sao cho kết hợp với mọi giá trị Y trong S đều tồn tại trong R.
| A | B | C | D | C | D | A | B | ||
| a1 | b1 | c1 | d1 | c1 | d1 | a2 | b1 | ||
| a2 | b1 | c2 | d3 | c2 | d3 | ||||
| a2 | b1 | c1 | d1 | ||||||
| a3 | b1 | c1 | d3 |
Chỉ có bộ (a2, b1) kết hợp được với tất cả các bộ của S. Ví dụ thực tế: T = ĐĂNG_KÝ ÷ HP_BẮT_BUỘC tìm sinh viên đã đăng ký tất cả học phần bắt buộc.
5. Tóm tắt lời khuyên
- Ưu tiên phép chọn để lọc dữ liệu trước, nhằm giảm kích thước dữ liệu và tăng hiệu năng.
- Dùng phép chiếu cho những thuộc tính cần thiết để giới hạn thuộc tính.
- Sử dụng kết nối phải chính xác, xác định rõ điều kiện nối và quan hệ nghiệp vụ.
- Cân nhắc sử dụng phép chia, kiểm tra kỹ dữ liệu mẫu để đảm bảo kết quả phản ánh đúng logic nghiệp vụ.
1. Phép đổi tên (Rename) ρ
Phép đổi tên dùng để đổi tên quan hệ hoặc các thuộc tính của quan hệ, giúp biểu diễn rõ ràng các biểu thức và xử lý các trường hợp thuộc tính trùng tên. Ký hiệu: ρ_{S}(R) đổi tên quan hệ R thành S; ρ_{B1,...,Bn}(R) đổi tên các thuộc tính; ρ_{S(B1,...,Bn)}(R) đổi cả tên quan hệ và thuộc tính.
| Biểu thức | Ý nghĩa |
|---|---|
| ρ_{T}(R) | Đổi tên quan hệ R thành T, giữ nguyên các thuộc tính |
| ρ_{A1,B1}(R(A,B)) | Đổi tên thuộc tính A thành A1, B thành B1 |
| ρ_{R1(A,B)}(R) | Đổi tên quan hệ thành R1 và các thuộc tính tương ứng |
Phép đổi tên thường dùng khi kết nối một quan hệ với chính nó (self-join) hoặc khi cần làm rõ ý nghĩa các cột trong kết quả.
2. Biểu thức đại số quan hệ
Biểu thức đại số quan hệ là sự kết hợp tuần tự các phép toán để biến đổi một hoặc nhiều quan hệ đầu vào thành quan hệ kết quả thỏa mãn yêu cầu nghiệp vụ. Mỗi phép toán nhận đầu vào là quan hệ và trả về một quan hệ; biểu thức được xây dựng theo thứ tự logic xử lý dữ liệu; kết quả phản ánh đúng ý nghĩa nghiệp vụ.
3. Toán tử logic và so sánh
| Loại | Ký hiệu | Ý nghĩa | Ví dụ |
|---|---|---|---|
| Logic | ∧ (AND) | Đúng khi tất cả điều kiện đúng | SINH_VIÊN(GiớiTính='Nữ' AND NămSinh>2000) |
| Logic | ∨ (OR) | Đúng khi ít nhất một điều kiện đúng | ĐĂNG_KÝ(TênHP='CSDL' OR TênHP='Mạng') |
| Logic | ¬ (NOT) | Phủ định điều kiện | SINH_VIÊN(¬(GiớiTính='Nữ')) |
| So sánh | =, ≠, <, >, ≤, ≥ | So sánh giá trị thuộc tính hoặc hằng | HỌC_PHẦN(SốTC ≥ 3) |
4. Hàm tiện ích và hàm gom nhóm
| Nhóm | Hàm | Ý nghĩa | Ví dụ |
|---|---|---|---|
| Chuỗi | UPPER(), LOWER(), LENGTH() | Chuyển chữ hoa, chữ thường, độ dài chuỗi | SINH_VIÊN(LOWER(HọTên)) |
| Ngày tháng | YEAR(), MONTH(), DAY() | Trích xuất năm, tháng, ngày | SINH_VIÊN(YEAR(NgàySinh)=2001) |
| Gom nhóm | COUNT(), SUM(), AVG(), MAX(), MIN() | Thống kê, tổng hợp dữ liệu | COUNT(MãHP; ĐĂNG_KÝ, MãSV) |
Ký hiệu gom nhóm: TÊN_HÀM(B; R, A), trong đó R là quan hệ, A là thuộc tính cần tính, B là thuộc tính gom nhóm. Ví dụ AVG(MãHP; ĐĂNG_KÝ, Điểm) tính điểm trung bình theo mã học phần.
5. Nguyên tắc viết biểu thức
- Mỗi phép toán nhận đầu vào là quan hệ và trả về một quan hệ.
- Biểu thức được xây dựng theo thứ tự logic xử lý dữ liệu: thường chọn trước, chiếu sau, kết nối khi cần.
- Kết quả phải phản ánh đúng ý nghĩa nghiệp vụ.
- Khi dùng hàm gom nhóm, cần xác định rõ thuộc tính gom nhóm và thuộc tính cần tính.
6. Ví dụ biểu thức
Cho các quan hệ: SINH_VIÊN(MãSV, HọTên, NgàySinh, GiớiTính), HỌC_PHẦN(MãHP, TênHP, SốTC), ĐĂNG_KÝ(MãSV, MãHP, NgàyĐK, Điểm).
- Yêu cầu 1 - Sinh viên Nam sinh sau năm 2000: SINH_VIÊN(GiớiTính='Nam' AND YEAR(NgàySinh)>2000).
- Yêu cầu 2 - Sinh viên có điểm ≥ 8 ở bất kỳ học phần: (SINH_VIÊN * ĐĂNG_KÝ)(Điểm ≥ 8).
- Yêu cầu 3 - Sinh viên đăng ký học phần từ 3 tín chỉ và điểm < 5: (ĐĂNG_KÝ * HỌC_PHẦN)(SốTC ≥ 3 AND Điểm < 5).
- Yêu cầu 4 - Danh sách sinh viên Nam có điểm > điểm trung bình của học phần: (SINH_VIÊN * ĐĂNG_KÝ)(GiớiTính='Nam' AND (Điểm > AVG(MãHP; ĐĂNG_KÝ, Điểm)))[MãSV, HọTên].
- Yêu cầu 5 - Sinh viên Nữ sinh sau 2001, đăng ký học phần ≥ 3 tín chỉ và điểm ≥ 8: (SINH_VIÊN * ĐĂNG_KÝ * HỌC_PHẦN)(GiớiTính='Nữ' AND YEAR(NgàySinh)>2001 AND SốTC ≥ 3 AND Điểm ≥ 8).
Ví dụ tổng hợp: Hệ thống quản lý đào tạo
Cho ba quan hệ:
- SINH_VIÊN(MãSV, HọTên, NgàySinh, GiớiTính)
- HỌC_PHẦN(MãHP, TênHP, SốTC)
- ĐĂNG_KÝ(MãSV, MãHP, NgàyĐK, Điểm)
Dữ liệu mẫu:
| MãSV | HọTên | NgàySinh | GiớiTính |
|---|---|---|---|
| SV01 | An | 2000-05-10 | Nam |
| SV02 | Bình | 2001-09-12 | Nữ |
| SV03 | Chi | 2002-03-04 | Nữ |
| SV04 | Dũng | 1999-11-20 | Nam |
| MãHP | TênHP | SốTC |
|---|---|---|
| HP01 | CSDL | 3 |
| HP02 | Mạng | 2 |
| HP03 | AI | 4 |
| MãSV | MãHP | NgàyĐK | Điểm |
|---|---|---|---|
| SV01 | HP01 | 2024-09-01 | 8.5 |
| SV01 | HP02 | 2024-09-02 | 7.0 |
| SV02 | HP01 | 2024-09-03 | 9.0 |
| SV02 | HP03 | 2024-09-04 | 8.0 |
| SV03 | HP01 | 2024-09-05 | 6.5 |
| SV04 | HP02 | 2024-09-06 | 4.5 |
Yêu cầu 1: Sinh viên Nam sinh sau năm 2000
Biểu thức: SINH_VIÊN(GiớiTính='Nam' AND YEAR(NgàySinh)>2000).
| MãSV | HọTên | NgàySinh | GiớiTính |
|---|---|---|---|
| SV01 | An | 2000-05-10 | Nam |
Yêu cầu 2: Sinh viên có điểm ≥ 8 ở bất kỳ học phần nào
Bước 1: Kết nối SINH_VIÊN và ĐĂNG_KÝ: SINH_VIÊN * ĐĂNG_KÝ.
Bước 2: Chọn các bộ có Điểm ≥ 8.
Bước 3: Chiếu lấy MãSV, HọTên.
| MãSV | HọTên |
|---|---|
| SV01 | An |
| SV02 | Bình |
Yêu cầu 3: Sinh viên đăng ký học phần từ 3 tín chỉ và điểm < 5
Bước 1: Kết nối ĐĂNG_KÝ và HỌC_PHẦN: ĐĂNG_KÝ * HỌC_PHẦN.
Bước 2: Chọn các bộ có SốTC ≥ 3 AND Điểm < 5.
Bước 3: Chiếu lấy MãSV, HọTên.
| MãSV | HọTên |
|---|---|
| SV04 | Dũng |
Yêu cầu 4: Sinh viên Nữ sinh sau năm 2001, đăng ký học phần ≥ 3 tín chỉ và điểm ≥ 8
Bước 1: Kết nối ba quan hệ: SINH_VIÊN * ĐĂNG_KÝ * HỌC_PHẦN.
Bước 2: Chọn các bộ thỏa: GiớiTính='Nữ' AND YEAR(NgàySinh)>2001 AND SốTC ≥ 3 AND Điểm ≥ 8.
Bước 3: Chiếu lấy MãSV, HọTên.
| MãSV | HọTên |
|---|---|
| SV02 | Bình |
Yêu cầu 5: Sinh viên đã đăng ký tất cả học phần bắt buộc
Cho HP_BẮT_BUỘC(MãHP) với các giá trị HP01, HP02. Biểu thức: ĐĂNG_KÝ[MãSV, MãHP] ÷ HP_BẮT_BUỘC.
| MãSV | MãHP |
|---|---|
| SV01 | HP01 |
| SV01 | HP02 |
Kết quả: SV01, vì sinh viên này đăng ký đủ cả HP01 và HP02.
1. Bảng so sánh tổng quan
| Tiêu chí | Đại số quan hệ | SQL |
|---|---|---|
| Bản chất | Ngôn ngữ hình thức, mang tính thủ tục (procedural) | Ngôn ngữ truy vấn bậc cao, mang tính khai báo (declarative) |
| Đối tượng thao tác | Quan hệ (tập các bộ không trùng lặp) | Bảng (multiset/bag, có thể trùng lặp nếu không dùng DISTINCT) |
| Ký hiệu | Ký hiệu toán học: σ, π, ∪, ∩, −, ×, *, ÷, ρ | Từ khóa tiếng Anh: SELECT, FROM, WHERE, JOIN, UNION, ... |
| Người dùng | Chủ yếu dùng trong lý thuyết và tối ưu truy vấn | Dùng trực tiếp bởi người dùng và ứng dụng |
| Ánh xạ | Mọi truy vấn SQL đều có thể ánh xạ về biểu thức đại số quan hệ | Được hệ quản trị chuyển thành kế hoạch thực thi dựa trên đại số quan hệ |
2. Ánh xạ phép toán sang SQL
| Đại số quan hệ | SQL tương ứng | Ghi chú |
|---|---|---|
| σ_E(R) | SELECT * FROM R WHERE E; | Lọc dòng |
| π_X(R) | SELECT DISTINCT X FROM R; | Lọc cột, loại trùng |
| R ∪ S | SELECT ... FROM R UNION SELECT ... FROM S; | Loại trùng lặp |
| R ∩ S | SELECT ... FROM R INTERSECT SELECT ... FROM S; | Một số hệ quản trị hỗ trợ |
| R − S | SELECT ... FROM R EXCEPT SELECT ... FROM S; | Hoặc MINUS ở Oracle |
| R × S | SELECT * FROM R CROSS JOIN S; | Tích Descartes |
| R * S | SELECT ... FROM R NATURAL JOIN S; hoặc JOIN ... ON R.X=S.X; | Kết nối tự nhiên |
| R ÷ S | Không có toán tử trực tiếp; dùng NOT EXISTS hoặc GROUP BY ... HAVING COUNT | Truy vấn dạng với mọi |
| ρ_{S}(R) | SELECT ... FROM R AS S; | Đổi tên bảng/cột |
| Hàm gom nhóm | GROUP BY, HAVING, COUNT/SUM/AVG/MAX/MIN | Tổng hợp dữ liệu |
3. Điểm khác biệt quan trọng
- Đại số quan hệ là tập (set) nên không có bộ trùng lặp; SQL mặc định là bag, có thể trả về dòng trùng nếu không dùng DISTINCT.
- Đại số quan hệ có phép chia trực tiếp cho truy vấn dạng với mọi; SQL phải mô phỏng bằng NOT EXISTS hoặc GROUP BY HAVING COUNT.
- SQL hỗ trợ nhiều tính năng beyond đại số quan hệ như ORDER BY, GROUP BY, hàm tổng hợp, view, transaction, điều khiển truy cập.
- Đại số quan hệ là công cụ tư duy và tối ưu; SQL là công cụ giao tiếp với hệ quản trị và người dùng.
4. Ví dụ so sánh
Yêu cầu: tìm sinh viên có điểm ≥ 8 ở bất kỳ học phần nào.
Đại số quan hệ: (SINH_VIÊN * ĐĂNG_KÝ)(Điểm ≥ 8)[MãSV, HọTên].
SQL:
SELECT DISTINCT SV.MãSV, SV.HọTên FROM SINH_VIÊN SV JOIN ĐĂNG_KÝ DK ON SV.MãSV = DK.MãSV WHERE DK.Điểm >= 8;
Bài tập 4_1 - Các phép toán lý thuyết tập hợp trên hai quan hệ tương thích
Cho hai quan hệ R(ABC) và S(ABC) có cùng lược đồ nên tương thích (khả hợp), dữ liệu như sau.
Quan hệ R:
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a1 | b2 | c1 |
| a2 | b2 | c2 |
Quan hệ S:
| A | B | C |
|---|---|---|
| a2 | b1 | c2 |
| a2 | b2 | c2 |
1. R ∪ S (hợp): lấy mọi bộ thuộc R hoặc S, loại bỏ bộ trùng. Bộ (a2,b2,c2) xuất hiện ở cả R và S nên chỉ giữ một lần.
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a1 | b2 | c1 |
| a2 | b1 | c2 |
| a2 | b2 | c2 |
2. R − S (hiệu): các bộ thuộc R nhưng không thuộc S. Bộ (a2,b2,c2) có trong S nên bị loại.
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a1 | b2 | c1 |
3. R ∩ S (giao): các bộ xuất hiện đồng thời trong cả R và S.
| A | B | C |
|---|---|---|
| a2 | b2 | c2 |
Bài tập 4_2 - Tích Đề-các của hai quan hệ
Cho R(ABC) và S(DEF) không cần tương thích. Tính R × S.
R:
| A | B | C |
|---|---|---|
| a | b | C |
| d | a | F |
| c | b | D |
S:
| D | E | F |
|---|---|---|
| a | b | c |
| d | a | f |
Kết quả R × S có 3 × 2 = 6 bộ, lược đồ ABCDEF (thuộc tính D,E,F của S được nối thêm).
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| a | b | C | a | b | c |
| a | b | C | d | a | f |
| d | a | F | a | b | c |
| d | a | F | d | a | f |
| c | b | D | a | b | c |
| c | b | D | d | a | f |
Bài tập 4_3 - Phép chia R : S
Cho R(ABCD) và S(CD). Tính R : S (tức R ÷ S).
R:
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | c1 | d2 |
| a1 | b1 | c2 | d3 |
| a1 | b2 | c1 | d2 |
| a2 | b1 | c1 | d1 |
| a2 | b1 | c2 | d1 |
S:
| C | D |
|---|---|
| c1 | d2 |
| c2 | d3 |
Phép chia tìm các giá trị (A,B) sao cho với mọi bộ (C,D) trong S, bộ (A,B,C,D) đều có trong R.
Xét (a1,b1): có (c1,d2) và (c2,d3) trong R → thỏa. Xét (a1,b2): thiếu (c2,d3). Xét (a2,b1): các bộ của R có D=d1, không khớp S.
Kết quả R : S:
| A | B |
|---|---|
| a1 | b1 |
Bài tập 4_4 - Thuật toán thực hiện các biểu thức quan hệ
Viết thuật toán cho các biểu thức sau (U,V là tập thuộc tính; X,Y,Z là tập thuộc tính; E là biểu thức logic).
1. R(E)[X] với R(U), X ⊆ U, E phát biểu trên U. Nghĩa là chọn các bộ của R thỏa E rồi chiếu lên X.
Create(T, X); // T rỗng
For each tuple t in R do
If t(E) = TRUE then
If !(t.X in T) then Add(T, t.X);
End if;
End for;
Return T;
2. (P*Q)(E) với P(X), Q(Y), X∩Y ≠ ∅, E phát biểu trên XY. Nghĩa là kết nối tự nhiên P và Q rồi chọn theo E.
Create(T1, X∪Y); // T1 rỗng
Xc = X ∩ Y;
For each tuple p in P do
For each tuple q in Q do
If p.Xc = q.Xc then
Add(T1, (p, q.(Y-Xc)));
End if;
End for;
End for;
Create(T, X∪Y); // T rỗng
For each tuple t in T1 do
If t(E) = TRUE then Add(T, t);
End for;
Return T;
3. (P*Q)[Z] với P(X), Q(Y), X∩Y ≠ ∅, Z ⊆ XY. Nghĩa là kết nối tự nhiên rồi chiếu lên Z.
Create(T1, X∪Y); // T1 rỗng
Xc = X ∩ Y;
For each tuple p in P do
For each tuple q in Q do
If p.Xc = q.Xc then Add(T1, (p, q.(Y-Xc)));
End for;
End for;
Create(T, Z); // T rỗng
For each tuple t in T1 do
If !(t.Z in T) then Add(T, t.Z);
End for;
Return T;
4. P*Q(E) với P(X), Q(Y), X∩Y ≠ ∅, E phát biểu trên Y. Nghĩa là kết nối tự nhiên rồi chọn theo điều kiện trên thuộc tính của Q.
Create(T1, X∪Y); // T1 rỗng
Xc = X ∩ Y;
For each tuple p in P do
For each tuple q in Q do
If p.Xc = q.Xc then Add(T1, (p, q.(Y-Xc)));
End for;
End for;
Create(T, X∪Y); // T rỗng
For each tuple t in T1 do
If t_Y(E) = TRUE then Add(T, t); // t_Y là phần thuộc tính Y của t
End for;
Return T;
5. P*Q[Z] với X∩Z ≠ ∅ và Z ⊆ Y. Nghĩa là kết nối tự nhiên rồi chiếu lên Z (Z nằm trong Y).
Create(T1, X∪Y); // T1 rỗng
Xc = X ∩ Y;
For each tuple p in P do
For each tuple q in Q do
If p.Xc = q.Xc then Add(T1, (p, q.(Y-Xc)));
End for;
End for;
Create(T, Z); // T rỗng
For each tuple t in T1 do
If !(t.Z in T) then Add(T, t.Z);
End for;
Return T;
Bài tập 4_5 - Chọn và chiếu trên quan hệ R(ABCD)
Cho quan hệ R:
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | 3 | 1 |
| a1 | b1 | 2 | 4 |
| a2 | b1 | 4 | 3 |
| a2 | b2 | 5 | 6 |
| a1 | b2 | 3 | 1 |
1. R(A=a1): các bộ có A=a1.
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | 3 | 1 |
| a1 | b1 | 2 | 4 |
| a1 | b2 | 3 | 1 |
2. R(C>3): các bộ có C>3.
| A | B | C | D |
|---|---|---|---|
| a2 | b1 | 4 | 3 |
| a2 | b2 | 5 | 6 |
3. R(A=a1 ∨ C≥4): các bộ có A=a1 hoặc C≥4 (gồm tất cả các bộ của R).
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | 3 | 1 |
| a1 | b1 | 2 | 4 |
| a2 | b1 | 4 | 3 |
| a2 | b2 | 5 | 6 |
| a1 | b2 | 3 | 1 |
4. R[ABC]: chiếu lên A,B,C, loại trùng.
| A | B | C |
|---|---|---|
| a1 | b1 | 3 |
| a1 | b1 | 2 |
| a2 | b1 | 4 |
| a2 | b2 | 5 |
| a1 | b2 | 3 |
5. R[ACD]: chiếu lên A,C,D, loại trùng (bộ (a1,3,1) xuất hiện hai lần nên chỉ giữ một).
| A | C | D |
|---|---|---|
| a1 | 3 | 1 |
| a1 | 2 | 4 |
| a2 | 4 | 3 |
| a2 | 5 | 6 |
Bài tập 4_6 - Các phép toán trên hai quan hệ tương thích R, S
R và S có cùng lược đồ ABCD.
R:
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 |
S:
| A | B | C | D |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 1 | 1 | 1 | 0 |
1. R ∪ S:
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
R ∩ S:
| A | B | C | D |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 |
R − S:
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
S − R:
| A | B | C | D |
|---|---|---|---|
| 2 | 2 | 1 | 1 |
2. Với X={A,B}, Y={A,C,D}:
R[X]:
| A | B |
|---|---|
| 1 | 0 |
| 1 | 1 |
S[X]:
| A | B |
|---|---|
| 1 | 1 |
| 2 | 2 |
(R ∪ S)[X]:
| A | B |
|---|---|
| 1 | 0 |
| 1 | 1 |
| 2 | 2 |
(R ∩ S)[Y] với Y={A,C,D}:
| A | C | D |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 1 | 1 |
3. E = “(A=1) ∧ (D=0)”:
R(E):
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 |
(R ∪ S)(E):
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 |
Bài tập 4_7 - Các phép toán trên R, S, Q
R(ABCD):
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | c1 | d1 |
| a2 | b1 | c1 | d1 |
| a2 | b2 | c2 | d2 |
| a2 | b2 | c3 | d2 |
S(ABCD):
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | c3 | d1 |
| a2 | b1 | c1 | d1 |
| a1 | b1 | c1 | d1 |
Q(A,E,F,G):
| A | E | F | G |
|---|---|---|---|
| a1 | e2 | f1 | g1 |
| a2 | e1 | f1 | g1 |
| a1 | e2 | f2 | g2 |
| a4 | e2 | f2 | g2 |
1. R ∪ S:
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | c1 | d1 |
| a2 | b1 | c1 | d1 |
| a2 | b2 | c2 | d2 |
| a2 | b2 | c3 | d2 |
| a1 | b1 | c3 | d1 |
R ∩ S:
| A | B | C | D |
|---|---|---|---|
| a1 | b1 | c1 | d1 |
| a2 | b1 | c1 | d1 |
R − S:
| A | B | C | D |
|---|---|---|---|
| a2 | b2 | c2 | d2 |
| a2 | b2 | c3 | d2 |
2. R × Q (16 bộ, lược đồ A B C D A E F G):
| A | B | C | D | A | E | F | G |
|---|---|---|---|---|---|---|---|
| a1 | b1 | c1 | d1 | a1 | e2 | f1 | g1 |
| a1 | b1 | c1 | d1 | a2 | e1 | f1 | g1 |
| a1 | b1 | c1 | d1 | a1 | e2 | f2 | g2 |
| a1 | b1 | c1 | d1 | a4 | e2 | f2 | g2 |
| a2 | b1 | c1 | d1 | a1 | e2 | f1 | g1 |
| a2 | b1 | c1 | d1 | a2 | e1 | f1 | g1 |
| a2 | b1 | c1 | d1 | a1 | e2 | f2 | g2 |
| a2 | b1 | c1 | d1 | a4 | e2 | f2 | g2 |
| a2 | b2 | c2 | d2 | a1 | e2 | f1 | g1 |
| a2 | b2 | c2 | d2 | a2 | e1 | f1 | g1 |
| a2 | b2 | c2 | d2 | a1 | e2 | f2 | g2 |
| a2 | b2 | c2 | d2 | a4 | e2 | f2 | g2 |
| a2 | b2 | c3 | d2 | a1 | e2 | f1 | g1 |
| a2 | b2 | c3 | d2 | a2 | e1 | f1 | g1 |
| a2 | b2 | c3 | d2 | a1 | e2 | f2 | g2 |
| a2 | b2 | c3 | d2 | a4 | e2 | f2 | g2 |
R * Q (kết nối tự nhiên trên A):
| A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|
| a1 | b1 | c1 | d1 | e2 | f1 | g1 |
| a1 | b1 | c1 | d1 | e2 | f2 | g2 |
| a2 | b1 | c1 | d1 | e1 | f1 | g1 |
| a2 | b2 | c2 | d2 | e1 | f1 | g1 |
| a2 | b2 | c3 | d2 | e1 | f1 | g1 |
R[AB]:
| A | B |
|---|---|
| a1 | b1 |
| a2 | b1 |
| a2 | b2 |
Q(A=a1 ∨ E=e2):
| A | E | F | G |
|---|---|---|---|
| a1 | e2 | f1 | g1 |
| a1 | e2 | f2 | g2 |
| a4 | e2 | f2 | g2 |
3. (R * Q)(A=a1 ∨ E=e2)[AB]: từ R*Q chọn các bộ có A=a1 hoặc E=e2, rồi chiếu lên A,B.
Các bộ thỏa: (a1,b1,c1,d1,e2,...) và (a1,b1,c1,d1,e2,...). Chiếu lên A,B cho một bộ.
| A | B |
|---|---|
| a1 | b1 |
Bài tập 4_8 - Kết hợp chiếu, chọn và kết nối tự nhiên
R(ABC):
| A | B | C |
|---|---|---|
| a1 | 2 | c1 |
| a2 | 3 | c2 |
| a3 | 4 | c3 |
S(A,D,F,G):
| A | D | F | G |
|---|---|---|---|
| a1 | 1 | f1 | g1 |
| a1 | 2 | f2 | g1 |
| a3 | 3 | f2 | g2 |
| a4 | 4 | f3 | g1 |
1. R[AC] * S(5 − D > 2): chọn S với 5-D>2 (D<3), rồi kết nối tự nhiên với R[AC] trên A.
S(5-D>2):
| A | D | F | G |
|---|---|---|---|
| a1 | 1 | f1 | g1 |
| a1 | 2 | f2 | g1 |
Kết quả:
| A | C | D | F | G |
|---|---|---|---|---|
| a1 | c1 | 1 | f1 | g1 |
| a1 | c1 | 2 | f2 | g1 |
2. (R * S)(A = a1 ∧ C ≠ c2):
R * S:
| A | B | C | D | F | G |
|---|---|---|---|---|---|
| a1 | 2 | c1 | 1 | f1 | g1 |
| a1 | 2 | c1 | 2 | f2 | g1 |
| a3 | 4 | c3 | 3 | f2 | g2 |
Kết quả sau chọn:
| A | B | C | D | F | G |
|---|---|---|---|---|---|
| a1 | 2 | c1 | 1 | f1 | g1 |
| a1 | 2 | c1 | 2 | f2 | g1 |
3. R(A ≠ a2 ∨ B < 3)[AC] * S: chọn R với A≠a2 hoặc B<3, chiếu AC, rồi kết nối với S.
R(A≠a2 ∨ B<3): a1 2 c1 và a3 4 c3 (bộ a2 3 c2 bị loại).
(R(...))[AC]: (a1,c1), (a3,c3).
Kết quả:
| A | C | D | F | G |
|---|---|---|---|---|
| a1 | c1 | 1 | f1 | g1 |
| a1 | c1 | 2 | f2 | g1 |
| a3 | c3 | 3 | f2 | g2 |
Bài tập 4_9 - Nhiều phép toán trên R(ABCD) và S(CD)
R:
| A | B | C | D |
|---|---|---|---|
| a | 1 | x | 2 |
| a | 1 | y | 2 |
| b | 2 | x | 1 |
| b | 2 | y | 1 |
| a | 4 | x | 2 |
| c | 5 | y | 7 |
S:
| C | D |
|---|---|
| x | 1 |
| y | 2 |
1. R[AB]:
| A | B |
|---|---|
| a | 1 |
| b | 2 |
| a | 4 |
| c | 5 |
2. R(3 − B + D > 1): các bộ thỏa điều kiện (trừ bộ a 4 x 2).
| A | B | C | D |
|---|---|---|---|
| a | 1 | x | 2 |
| a | 1 | y | 2 |
| b | 2 | x | 1 |
| b | 2 | y | 1 |
| c | 5 | y | 7 |
3. R(B<4) ∪ R(D>3):
| A | B | C | D |
|---|---|---|---|
| a | 1 | x | 2 |
| a | 1 | y | 2 |
| b | 2 | x | 1 |
| b | 2 | y | 1 |
| c | 5 | y | 7 |
4. R(B≥1 ∧ B≤5): tất cả các bộ của R.
| A | B | C | D |
|---|---|---|---|
| a | 1 | x | 2 |
| a | 1 | y | 2 |
| b | 2 | x | 1 |
| b | 2 | y | 1 |
| a | 4 | x | 2 |
| c | 5 | y | 7 |
5. R*S[C]: kết nối tự nhiên R và S trên C,D, rồi chiếu C.
| C |
|---|
| x |
| y |
6. R(B<4) − R(D>3):
| A | B | C | D |
|---|---|---|---|
| a | 1 | x | 2 |
| a | 1 | y | 2 |
| b | 2 | x | 1 |
| b | 2 | y | 1 |
7. R(B<4) ∩ R(D>3): kết quả rỗng.
| A | B | C | D |
|---|---|---|---|
| (rỗng) | |||
8. R : S: kết quả rỗng, vì không có cặp (A,B) nào kết hợp được với mọi cặp (C,D) của S.
| A | B |
|---|---|
| (rỗng) | |
Bài tập 4_10 - Biểu thức đại số quan hệ trên CSDL NHÂN VIÊN
Lược đồ: NHANVIEN(Manv, Hoten, Ngaysinh, Gioitinh, Noisinh, Maphong, Macv); PHONG(Maphong, Tenphong); CHUCVU(Macv, Tencv).
1. Họ và tên, ngày sinh, giới tính, tên phòng của mỗi nhân viên:
(NHANVIEN * PHONG)[Hoten, Ngaysinh, Gioitinh, Tenphong]
2. Họ và tên, ngày sinh, giới tính, nơi sinh của nhân viên có tên chức vụ “Trưởng phòng”:
((NHANVIEN * CHUCVU)(Tencv = "Trưởng phòng"))[Hoten, Ngaysinh, Gioitinh, Noisinh]
3. Họ và tên, ngày sinh, tên chức vụ của nhân viên nữ, nơi sinh Bình Định:
((NHANVIEN * CHUCVU)(Gioitinh = "Nữ" ∧ Noisinh = "Bình Định"))[Hoten, Ngaysinh, Tencv]
4. Họ và tên, ngày sinh, tên phòng của nhân viên nơi sinh Bình Định hoặc Đăk Lăk và giới tính Nam:
((NHANVIEN * PHONG)((Noisinh = "Bình Định" ∨ Noisinh = "Đăk Lăk") ∧ Gioitinh = "Nam"))[Hoten, Ngaysinh, Tenphong]
Bài tập 4_11 - Biểu thức đại số quan hệ trên CSDL THỰC TẬP
Lược đồ: SV(MSV, HT, NS, QQ, HL); DT(MDT, TDT, CN, KP); SD(MSV, MDT, NTT, KM, KQ). Tuổi tính đến năm 2022.
1. Thông tin sinh viên sinh trước năm 2005 và quê quán ở Bình Định:
SV(NS < 2005 ∧ QQ = "Bình Định")
2. Danh sách các tỉnh sinh viên đến thực tập:
SD[NTT]
3. Danh sách các tỉnh có sinh viên thực tập xa trường hơn 100 km của mã đề tài số 7:
(SD(MDT = 7 ∧ KM > 100))[NTT]
4. Thông tin tình hình thực tập của sinh viên làm đề tài ở nơi thực tập Quảng Ngãi:
SD(NTT = "Quảng Ngãi")
5. Danh sách sinh viên thực tập tại quê nhà:
((SV * SD)(QQ = NTT))[MSV, HT, NS, QQ, HL]
6. Thông tin về các đề tài có sinh viên thực tập tham gia:
(DT * SD)[MDT, TDT, CN, KP]
7. Thông tin mã đề tài không có sinh viên nào tham gia:
DT[MDT] − SD[MDT]
8. Thông tin mã đề tài có kinh phí bằng 3 triệu hoặc lớn hơn bằng 5 triệu:
(DT(KP = 3) ∪ DT(KP ≥ 5))[MDT]
9. Mã những sinh viên dưới 20 tuổi và có kết quả thực tập trên 7 điểm:
((SV * SD)(2022 − NS < 20 ∧ KQ > 7))[MSV]
10. Danh sách sinh viên thực tập theo đề tài có kinh phí lớn hơn một phần năm tổng kinh phí cấp cho các đề tài:
((SV * SD * DT)(KP > SUM(; DT, KP) / 5))[MSV, HT]
11. Danh sách sinh viên có kết quả thực tập cao hơn điểm thực tập trung bình của đề tài mã số 4:
((SV * SD)(KQ > AVG(; SD(MDT = 4), KQ)))[MSV, HT]
5.1 Khái niệm phụ thuộc hàm
Trong mô hình dữ liệu quan hệ, phụ thuộc hàm là ràng buộc ngữ nghĩa giữa các thuộc tính trong một quan hệ, phản ánh quy luật xác định dữ liệu.
Định nghĩa: Cho quan hệ R(U), U là tập các thuộc tính. Với hai tập thuộc tính X, Y ⊆ U, ta nói X → Y nếu với mọi cặp bộ t1, t2 trong R, nếu t1.X = t2.X thì t1.Y = t2.Y. Nghĩa là giá trị của X quyết định duy nhất giá trị của Y.
Ý nghĩa: mô tả các ràng buộc ngữ nghĩa của dữ liệu; là cơ sở để xác định khóa của quan hệ và chuẩn hóa cơ sở dữ liệu; giúp giảm dư thừa và tránh bất nhất dữ liệu.
Ví dụ: SINH_VIEN(MaSV, HoVaTen, NgaySinh, GioiTinh) có MaSV → HoVaTen, NgaySinh, GioiTinh. DANG_KY(MaSV, MaHP, DiemHP) có MaSV, MaHP → DiemHP. Trên bảng với U = ABCD và các bộ (1,x,10,p), (1,x,10,q), (2,y,20,p), (3,z,30,r), các phụ thuộc A → B, B → C, A → C, AB → C thỏa mãn, còn A → D không thỏa vì cùng A = 1 nhưng D khác p và q.
Nhận xét: phụ thuộc hàm là quan hệ giữa thuộc tính, không phải giữa các bộ; nếu quan hệ có không quá một bộ thì luôn thỏa mọi phụ thuộc hàm; nếu một quan hệ con chứa X ∪ Y thì cũng thỏa X → Y.
5.2 Hệ tiên đề Armstrong và bao đóng
Ba tiên đề cơ bản:
- Phản xạ: nếu Y ⊆ X thì X → Y.
- Gia tăng: nếu X → Y thì XZ → YZ.
- Bắc cầu: nếu X → Y và Y → Z thì X → Z.
Từ ba tiên đề gốc suy ra các tính chất mở rộng: phân rã, hợp, tựa bắc cầu, cộng tính đầy đủ, mở rộng trái, phản xạ chặt.
Phụ thuộc hàm suy diễn: F ⊢ X → Y nếu suy ra được X → Y từ F bằng dãy bước hợp lệ dựa trên hệ tiên đề Armstrong. Bao đóng của tập phụ thuộc hàm F+ là tập tất cả phụ thuộc hàm suy diễn được từ F. Tính chất: F ⊆ F+, đơn điệu, lũy đẳng.
Bao đóng của tập thuộc tính X+ là tập tất cả thuộc tính có thể suy diễn từ X theo F. Thuật toán: khởi tạo X+ = X; với mỗi Y → Z ∈ F, nếu Y ⊆ X+ thì X+ = X+ ∪ Z; lặp đến khi X+ không thay đổi. Ví dụ với U = ABCDEGH, F = {B → A, DA → CE, D → H, GH → C, AC → D}, ta có (AC)+ = ACDEH.
Định lý liên hệ: X → Y ∈ F+ ⟺ Y ⊆ X+. Đây là nền tảng để kiểm tra phụ thuộc hàm, tìm khóa và chuẩn hóa.
5.3 Bài toán thành viên và phủ của tập phụ thuộc hàm
Bài toán thành viên: Cho R(U), F và f: X → Y, xác định xem X → Y có được suy diễn từ F hay không, tức X → Y ∈ F+ hay không. Cách giải: tính X+ theo F; nếu Y ⊆ X+ thì X → Y ∈ F+, ngược lại không.
Hai tập phụ thuộc hàm tương đương: F và G tương đương nếu F+ = G+. Kiểm tra bằng cách xét từng phụ thuộc hàm của tập này có phải là thành viên của tập kia hay không.
Các loại phủ:
- Phủ tự nhiên: bảo toàn ngữ nghĩa, vế trái khác nhau đôi một và X ∩ Y = ∅.
- Tập phụ thuộc hàm đầy đủ: vế trái tối thiểu, loại thuộc tính dư thừa ở vế trái.
- Phủ không dư: không có phụ thuộc hàm dư thừa.
- Phủ tối thiểu: vế phải một thuộc tính, vế trái tối thiểu, không phụ thuộc hàm dư thừa.
Thuật toán phủ tối thiểu: chuẩn hóa vế phải; thu gọn vế trái; loại phụ thuộc hàm dư thừa. Phủ tối thiểu có thể không duy nhất; nên chuyển về phủ tối thiểu trước khi tìm khóa và chuẩn hóa.
6.1 Khái niệm khóa
Một tập thuộc tính K ⊆ U được gọi là khóa của quan hệ R nếu và chỉ nếu: K → U ∈ F+ (K là siêu khóa, K+ = U) và K là tối thiểu, tức không tồn tại K' ⊂ K với K' → U.
Tương đương: K+ = U và với mọi A ∈ K, (K − {A})+ ≠ U.
Ví dụ: DANG_KY(MaSV, MaHP, Diem) với F = {MaSV, MaHP → Diem} có khóa {MaSV, MaHP}.
Tính chất: thuộc tính không xuất hiện ở vế phải của mọi phụ thuộc hàm luôn có mặt trong mọi khóa; nếu K = U − ∪right(f) và K+ = U thì khóa duy nhất; hai khóa không chứa nhau. Mỗi lược đồ luôn có ít nhất một khóa, xấu nhất là U. Khóa là siêu khóa nhỏ nhất. Khóa chính phải duy nhất và không được rỗng.
6.2 Thuật toán tìm một khóa
Thuật toán 1: Bắt đầu K = U. Với mỗi thuộc tính A ∈ K, nếu (K − {A})+ = U thì loại A khỏi K. Kết quả K là một khóa.
Thuật toán 2: K = U − ∪right(f). Tính K+; nếu K+ = U thì K là khóa. Ngược lại T = U − K+, bổ sung thuộc tính từ T vào K cho đến K+ = U. Sau đó thử loại các thuộc tính mới bổ sung nếu (K − {A})+ = U.
Ví dụ với U = ABCD, F = {A → B, B → C}: thuật toán 1 cho K = AD. Ví dụ với U = ABCDE, F = {A → B, B → C, CD → E}: K = AD. Ví dụ với F = {A → B, B → A, CD → E}: K = ACD.
6.3 Thuật toán tìm tất cả khóa và ví dụ thực tế
N = U − ∪right(f). Nếu N+ = U thì N là khóa duy nhất. Ngược lại T = U − N, xét các tập con Xi ⊆ T (Xi ≠ ∅), Si = N ∪ Xi; nếu Si+ = U thì Si là siêu khóa. Loại các siêu khóa không tối thiểu. Cải tiến: không xét Xi = ∅ và không xét tập con chứa tập khóa đã tìm được, duyệt theo kích thước tăng dần.
Ví dụ R(U,F), U = ABC, F = {AB → C, C → A}: N = B, T = AC, khóa là BA và BC.
Ví dụ thực tế LICH_THI: khóa kỹ thuật S1 = {MaSV, MaCaThi} và khóa nghiệp vụ S2 = {MaSV, MaMon, NgayThi, GioThi, PhongThi}. Triển khai chọn S1 làm khóa chính, S2 làm ràng buộc UNIQUE.
7.1 Các dạng chuẩn của quan hệ
Thuộc tính khóa là thuộc tính tham gia ít nhất một khóa; thuộc tính ngoài khóa không tham gia khóa nào.
- 1NF: mọi thuộc tính có giá trị nguyên tố, không có thuộc tính đa trị hay lặp.
- 2NF: đạt 1NF và mọi thuộc tính ngoài khóa phụ thuộc đầy đủ vào toàn bộ mỗi khóa; không có phụ thuộc bộ phận.
- 3NF: đạt 2NF và không tồn tại phụ thuộc bắc cầu từ khóa đến thuộc tính ngoài khóa; với mọi X → A, hoặc X là siêu khóa hoặc A là thuộc tính khóa.
- BCNF: mọi X → Y ∈ F+ với Y ⊄ X đều có X là siêu khóa.
Ví dụ: DANG_KY không đạt 2NF vì TenSV phụ thuộc MaSV và SoTinChi phụ thuộc MaMon. KET_QUA đạt 2NF. R(MaSV, MaLop, TenLop) không đạt 3NF vì MaLop → TenLop. ABC với AB → C, C → A không đạt BCNF vì C không là siêu khóa.
7.2 Phép phân tách quan hệ
Phân tách bảo toàn thông tin: hợp thuộc tính bằng U, chiếu bằng quan hệ con và nối tự nhiên khôi phục R. Với hai quan hệ, kiểm tra U1 ∩ U2 → (U1 − U2) hoặc (U2 − U1) ∈ F+. Với nhiều quan hệ dùng ma trận ký hiệu: lập ma trận 0/1, nếu trong một dòng các cột X cùng ký hiệu thì các cột Y gán cùng ký hiệu; nếu có dòng toàn 1 thì bảo toàn thông tin.
Phân tách bảo toàn phụ thuộc hàm: hợp các phụ thuộc chiếu π_Ui(F) có bao đóng bằng F+. Kiểm tra: với mỗi X → Y ∈ F, tính X+ theo F' = ∪π_Ui(F); nếu Y ⊆ X+ thì bảo toàn. Phân tách có thể bảo toàn thông tin nhưng không bảo toàn phụ thuộc hàm, thường khi đạt BCNF.
7.3 Phân tách về dạng chuẩn BCNF hoặc 3NF
Phân tách bảo toàn thông tin về BCNF/3NF: tìm khóa; phát hiện X → Y sao cho X không là siêu khóa và Y không chứa thuộc tính khóa; phân tách R thành R1 = R[XY] và R2 = R[U − Y]; lặp đến khi đạt chuẩn. Ví dụ SDIM với F = {SI → D, SD → M} phân tách thành SDM và SDI, cả hai đạt BCNF.
Phân tách 3NF bảo toàn thông tin và phụ thuộc hàm: dùng phủ tối thiểu Fc; gộp cùng vế trái; sinh Ri(Ui = X ∪ Y); nếu chưa có quan hệ chứa khóa thì thêm Rk(K). Ví dụ ABCDE với F = {BC → A, C → D, AE → B, B → D, B → E}: phủ tối thiểu như trên, gộp B → DE, sinh R1(BCA), R2(CD), R3(AEB), R4(BDE); R1 chứa khóa BC nên bảo toàn thông tin. Ưu tiên 3NF trong thực tế; BCNF khi chấp nhận mất phụ thuộc hàm.