Ngày xửa ngày xưa, khi khủng long còn to lớn... à nhầm, vào năm 1970, có một ông tên là Edgar Codd quyết định rằng mớ hỗn độn dữ liệu đã vượt quá mức "bừa bộn sáng tạo" và giống như một hố đen nuốt chửng thời gian lẫn tài nguyên. Edgar suy nghĩ rất lâu và cuối cùng nghĩ ra cách sắp xếp mọi thứ, đồng thời đặt nền móng cho cả một thế giới nơi dữ liệu được xếp thành từng bảng gọn gàng, như sách trên kệ thư viện lý tưởng. Dòng, cột, trật tự — không còn kiểu "thế cũng được" hay "ai mà chẳng hiểu".
Mô hình quan hệ dựa trên việc biểu diễn dữ liệu dưới dạng bảng, mỗi bảng gồm các dòng và cột. Nghe là hiểu ngay: dòng là bản ghi, cột là thuộc tính của bản ghi đó. Cách tiếp cận này giúp xử lý và thao tác dữ liệu dễ dàng hơn nhiều.
Hãy tưởng tượng bạn đặt hàng trên một shop online. Để đơn hàng được xử lý và giao thành công, hệ thống phải biết nhiều chi tiết: bạn là ai (khách hàng), bạn chọn dịch vụ giao hàng nào, giao tới đâu, và làm sao để theo dõi trạng thái đơn hàng.
Nếu tất cả thông tin này được lưu trong một bảng khổng lồ duy nhất, sẽ thành mớ hỗn độn: dữ liệu bị lặp lại, khó cập nhật và càng khó hơn để tìm thông tin cần thiết một cách nhanh chóng. Cách tiếp cận quan hệ giúp mọi thứ gọn gàng hơn bằng cách chia nhỏ thông tin ra nhiều bảng, các bảng này có thể trao đổi dữ liệu với nhau.
Sơ đồ dưới đây là ví dụ về cách tổ chức dữ liệu cho quá trình theo dõi giao hàng:
- Khách hàng - lưu thông tin về từng khách, mỗi người có Số Khách Hàng riêng biệt.
- Dịch vụ giao hàng - bảng này chứa danh sách các dịch vụ có thể giao hàng, mỗi dịch vụ có Số Dịch Vụ riêng.
- Giao hàng đơn - đây là bảng trung tâm, kết nối mọi thứ. Mỗi dòng là một lần giao hàng cụ thể. Nó có Số Giao Hàng riêng, đồng thời tham chiếu tới khách hàng, dịch vụ giao hàng, có thể tham chiếu tới đơn hàng cụ thể, ngày tạo và trạng thái hiện tại.
Mũi tên chỉ ra cách các bản ghi trong bảng Giao hàng đơn liên kết với các bản ghi trong bảng Khách hàng và Dịch vụ giao hàng.
Ví dụ minh họa bảng Giao hàng đơn:
| Số Giao Hàng | Số Khách Hàng | Số Dịch Vụ | Số Đơn Hàng | Ngày tạo | Trạng thái giao hàng |
|---|---|---|---|---|---|
| 121 | 101 | 1 | 1569 | 2025-03-23 | Đã giao |
| 122 | 234 | 3 | 1570 | 2025-03-24 | Đã giao |
| 123 | 1011 | 2 | 1571 | 2025-03-25 | Đang giao |
| 124 | 1011 | 2 | 1572 | 2025-03-25 | Chờ xử lý |
Lợi ích của cách làm này:
- Thông tin về khách hàng hoặc dịch vụ giao hàng chỉ lưu một lần, tránh bị lặp lại ở từng bản ghi giao hàng.
- Liên kết qua số hiệu duy nhất (còn gọi là khóa) giúp đảm bảo không có chuyện giao hàng cho khách không tồn tại hoặc qua dịch vụ không có thật.
- Dễ dàng kết hợp dữ liệu từ nhiều bảng để tạo báo cáo phức tạp hoặc lọc thông tin cụ thể.
- Khi thay đổi dữ liệu, chỉ cần sửa ở một nơi là mọi thao tác liên quan đều cập nhật ngay (ví dụ, số điện thoại dịch vụ giao hàng).
Cấu trúc cơ sở dữ liệu quan hệ
Trái tim của cơ sở dữ liệu quan hệ là bảng. Mỗi bảng có:
- Tên (Table Name) để nhận diện — ví dụ, customers.
- Tập hợp cột (Columns/Attributes), xác định thuộc tính của đối tượng.
- Khi đặt tên cột dùng làm số hiệu duy nhất (khóa chính), thường dùng mẫu
ten_id. Hậu tố_idnghĩa là "identifier". Ví dụ:Số Khách Hàngthànhcustomer_id. - Ví dụ, bảng customers: có thể gồm
customer_id,first_name,emailv.v.
- Khi đặt tên cột dùng làm số hiệu duy nhất (khóa chính), thường dùng mẫu
- Dữ liệu trong dòng (Rows/Records) - một dòng trong bảng customers: sẽ chứa đầy đủ thông tin về một khách hàng cụ thể (101, Alex Song v.v.).
Xem ví dụ bảng — customers:
| customer_id | full_name | phone_number | delivery_address | registration_date | |
|---|---|---|---|---|---|
| 101 | Alex Song | alex.song@example.com | 555-0101 | 123 Main St, Anytown | 2023-01-15 |
| 234 | Maria Garcia | maria.g@example.org | 555-0102 | 456 Oak Ave, Otherville | 2022-11-30 |
| 1011 | David Lee | david.lee@example.net | 555-0103 | 789 Pine Ln, Sometown | 2023-03-01 |
Khóa của bảng
Để xác định duy nhất từng dòng trong bảng, ta dùng khóa chính (Primary Key, PK). Đây là cột (hoặc nhiều cột) mà giá trị của nó là duy nhất cho mỗi dòng và không được để trống. Hãy tưởng tượng nó như số chứng minh thư cho mỗi bản ghi, ví dụ customer_id trong bảng customers: xác định duy nhất từng khách hàng.
Khóa chính giống như hộ chiếu, chính xác hơn là số hộ chiếu: duy nhất cho mỗi đối tượng. Và giúp tránh rắc rối với các dòng trùng tên.
Để tạo liên kết giữa các bảng, ta dùng khóa ngoại (Foreign Key, FK). Đây là cột trong một bảng, tham chiếu tới khóa chính ở bảng khác. Khóa ngoại là "cầu nối" giữa các bảng. Thường tên cột khóa ngoại trùng với tên khóa chính mà nó tham chiếu. Ví dụ, trong bảng deliveries cột customer_id là khóa ngoại, lưu giá trị từ cột customer_id của bảng customers, nhờ đó liên kết giao hàng với khách hàng.
Đây là sơ đồ quen thuộc, nhưng giờ đã sát thực tế hơn.
- Bảng customers lưu thông tin khách hàng; khóa chính là
customer_id. - Bảng delivery_services lưu dữ liệu về dịch vụ giao hàng; khóa chính là
service_id. - Bảng orders (hiển thị cho đầy đủ, vì có tham chiếu
order_idtừ bảng giao hàng) dùng để lưu thông tin đơn hàng, khóa chính làorder_id. - Bảng deliveries là trung tâm để theo dõi giao hàng. Nó có:
- Khóa chính riêng:
delivery_id. - Ba khóa ngoại để tạo liên kết:
customer_id(FK): liên kết giao hàng với khách hàng cụ thể từ bảng customers.service_id(FK): liên kết giao hàng với dịch vụ đã chọn từ bảng delivery_services.order_id(FK): liên kết giao hàng với đơn hàng tương ứng từ bảng orders.
- Trường
created_dateghi ngày giờ tạo bản ghi giao hàng.
- Khóa chính riêng:
Cách dùng khóa chính và khóa ngoại như vậy đảm bảo tính toàn vẹn dữ liệu. Hệ thống sẽ không cho tạo bản ghi giao hàng nếu customer_id hoặc order_id không tồn tại trong bảng liên quan, đồng thời cho phép truy xuất linh hoạt thông tin liên kết.
Lợi ích của mô hình quan hệ
Mô hình quan hệ có nhiều ưu điểm khiến nó dẫn đầu so với các cách tiếp cận khác:
- Cấu trúc đơn giản. Bảng với cột và dòng rất dễ hiểu.
- Linh hoạt khi thao tác dữ liệu. Thêm hoặc sửa dữ liệu dễ dàng mà không phá vỡ tính toàn vẹn.
- Hỗ trợ truy vấn phức tạp. Dùng SQL có thể lấy dữ liệu từ nhiều bảng, kết hợp, lọc và làm đủ thứ bạn cần. Ví dụ, tìm tất cả sinh viên đăng ký một khóa học cụ thể — dễ như ăn bánh!
- Toàn vẹn dữ liệu nhờ khóa. Dùng khóa chính và khóa ngoại đảm bảo dữ liệu luôn nhất quán. Không thể thêm bản ghi sinh viên vào khóa học nếu khóa học đó không tồn tại.
Mô hình dữ liệu quan hệ — nền tảng của cơ sở dữ liệu hiện đại. Đơn giản, mạnh mẽ và cực kỳ phù hợp để lưu trữ dữ liệu có cấu trúc. Như Edgar Codd từng nói: "Sắp xếp hoặc là chết!" (thực ra ông ấy nói khác, nhưng ý là vậy...). Ở bài sau, tụi mình sẽ tìm hiểu mô hình quan hệ khác gì so với các loại cơ sở dữ liệu khác (ví dụ NoSQL) và nên dùng khi nào.
GO TO FULL VERSION