Những điều mấu chốt về Cơ sở dữ liệu quan hệ – Relational Database.
Database & Table
Database: là một tập hợp các Table. Mỗi Table lại chứa danh sách các dữ liệu về một loại thông tin. Ví dụ: DBCongtyA có các bảng customers, employees, orders, products… lưu trữ danh sách các thông tin tương ứng.
Các tables còn được gọi là “entities”(thực thể).
Column & Row
Với mỗi bảng, mỗi Row(hàng) là thể hiện của 1 học sinh, 1 khách hàng, hoặc 1 nhân viên. Nhưng các hàng này phải tuân thủ theo các cấu trúc nhất định của bảng, hay nói cách khác, dữ liệu của mỗi hàng phải được tổ chức theo các Column(cột). Mỗi cột biểu thị một loại dữ liệu. Ví dụ như: tên, id, email, ngày sinh và thuộc loại như: text, date, hoặc number.
Mỗi hàng sẽ phải tuân theo cấu trúc và các định dạng mà các cột quy định. Với việc định nghĩa các cột, cũng chính là việc đặt các điều luật để dữ liệu nhập vào phải tuân theo và DBMS sẽ không để chúng phá vỡ các luật này.
Các Rows còn được gọi là “tuple”, và các Columns còn được gọi là “attribute” .
Có 3 loại columns:
- Simple: chỉ chứa duy nhất 1 value.
- Composite: giá trị chứa các giá trị khác. Ví dụ như cột name bảo gồm: first name, middle name, and last name. (cột loại này sẽ được tách ra thành cột Simple).
- Multi-Value: Đa giá trị nằm trong 1 cột. Ví dụ bạn có color của car, có thể là black và red.( cột loại này sẽ được đưa hẳn sang 1 bảng khác)
Constrain
Khi nãy có nhắc tới việc đặt điều luật cho column, đó chính là cái gọi là Constrain(rằng buộc), dữ liệu nhập vào cột sẽ tuân theo constrain mà bạn đặt. Ví dụ: bạn muốn cột name trong bàng Customer không được trống (bắt buộc nhập), bạn sẽ cần dùng tới contrain NOT NULL.
Có mấy loại contrain nhưng loại đầu tiên mình muốn đề cập là:
Primary key – PK (khóa chính)
Khi bạn đặt PK cho một cột có nghĩa là giá trị của cột đó sẽ không bị trùng, cột đó sẽ được coi như định danh độc nhất cho một hàng. Nếu bạn cố tình để giá trị trong cột này bị trùng. DBMS sẽ báo lỗi.
Thường thấy PK sẽ được đặt cho các cột “id” và thuộc kiểu integer.
PK tồn tại rất tự nhiên và được tạo ra bởi DBMS. Ví dụ, mỗi nhân viên trong công ty cần được cấp cho một mã nhân viên. Bởi vậy Mã nhân viên này phải là độc nhất cho từng người. Chỉ cần nó là có thể xác định được nhân viên đó và họ sẽ đặt cột Mã nhân viên này là PK.
DBMS có thể hỗ trợ bạn tạo ra PK tự động tăng (1, 2,3 ,4,…) nếu như bạn đánh dấu cột đó thêm chức năng “auto-increment”
PK rất quan trọng không chỉ vì người ta dùng nó để định danh cho các hàng, mà còn sử dụng nó là yếu tố để tạo liên kết quan hệ giữa các bảng trong RDB.
Foreigne key – FK (khóa ngoại)
Cột được đặt constrain FK sẽ phải được trỏ đến một PK của bảng khác để đảm bảo, các giá trị của cột FK này chỉ thuộc trong PK của bảng kia. Nếu giá trị trong PK không tuân thủ điều này, DBMS sẽ không cho phép dữ liệu này được nạp.
FK là mấu chốt để thiết lập nên quan hệ các bảng, là yếu tố quan trong để thực hiện các phép join bảng.
Unique key – UK (khóa unique)
UK có bản chất khá giống với PK, đơn giản nó là không cho phép các giá trị trùng lặp. PK cũng có tính chất này nhưng ở mức cao hơn là muốn phân biệt định danh bản ghi, còn UK chỉ đơn thuần làm việc của nó là không để giá trị trùng nhau.
Bạn có thể đặt nhiều UK cho các cột khác nhau, nhưng PK thì chỉ có một.
Table Relationship
Các tables thì liên kết tới nhau, bởi vậy chúng ta cần tao mối quan hệ cho chúng. Nên nhớ bạn không cố gắng tạo ra các quan hệ này cho chúng, mà hãy xem xét phân tích chúng có quan hệ với nhau thế nào.
Mình sẽ liệt kê các quan hệ dưới đây, kèm mô tả, giải thích, và cách thiết lập chúng.
One-to-One Relationship
Ví dụ: Chúng ta có bảng customer và bảng account. Điều bạn cần ở đây là 1 customer chỉ được có 1 account. Đó chính là quan hệ 1-1.
Cách định nghĩa 1-1 ra sao?
- Cách 1: Gộp 2 bảng thành 1 bảng (tuy nhiên bảng này sẽ gồm khá nhiều cột đấy)
- Cách 2: Thêm cột Customer_ID vào bảng Account, đặt 2 contrains cho cột mới này: Contrain FK trỏ tới cột CustomerID của bảng Customer và Constrain UK để đảm bảo giá trị không bị trùng lặp. Bạn sẽ có quan hệ 1-1
One-to-Many Relationship
Ví dụ: Chúng ta có bảng customer và bảng order. Mối quan hệ dễ thấy ở đây, một customer có thể có nhiều order và 1 order thì chỉ có thể thuộc về 1 và chỉ 1 khách hàng. Đó chính là quan hệ 1-M. Customer(bên một) – Order(bên nhiều)
Cách định nghĩa 1-M ra sao?
- Thêm cột IDCustomer(PK) vào bảng Order (bên nhiều).
- Đặt constrain FK cột này trỏ tới cột PK của bảng Customer

Lợi ích của việc tạo nên quan hệ này, đó là cho phép bạn trả lời các câu hỏi như: “Hóa đơn nào được đặt bởi khách hàng có tên Smith”?; “Tên của khách hàng có hóa đơn 1012 ?”.
Many-to-Many Relationship
Ví dụ: Chúng ta có bảng Student và bảng Course. Mối quan hệ dễ thấy ở đây, một student có thể đăng kí học nhiều course và 1 course thì có thể được đăng kí bởi nhiều student. Đó chính là quan hệ M-M.
Cách định nghĩa M-M ra sao?
- Tạo ra một bảng mới chứa cột StudentID & CourseID.
- 2 cột này sẽ được đặt khóa FK trỏ tới PK của 2 bảng Student và Course.
- Đặt nhóm PK cho 2 cột StudentID & CourseID, không để trùng lặp.

Lợi ích của việc tạo nên mối quan hệ này sẽ trả lời cho các câu hỏi như: “Danh sách các học sinh học môn Database?”; “Smith đã đăng kí các môn học nào?”
Recursive Relationship
Ví dụ: Chúng ta có một bảng Employee. Tình huống ở đây, một Employee cũng có thể là Supervisor của 1 hoặc nhiều Employees khác. Vậy trong trường hợp này sẽ là dư thiều nếu chúng ta tạo ra một bảng Supervisor có quan hệ 1-M với bảng Employee vì Supervisor thì cũng chính là 1 employee. Trong trường hợp này ta có thể giải quyết nó như sau:
- Tạo thêm một cột SupervisorID trong chính bảng Employees, đặt FK cột này trỏ tới cột EmployeeID.
Tổng kết về Relationship:
Các mối quan hệ liệt kê bên trên (1-1; 1-M; M-M; RS) đều được gọi là “Cardinality Constrains”. Chúng là các constrains quy định sự tham gia tối đa giữa các bảng.
Loại còn lại được gọi là “Existence Dependency Constraint” (còn gọi là “Participation Constraint”). Chúng là các constrains quy định sự tham gia tối thiểu giữa các bảng:
- Zero (optional participation – có hoặc không): Column FK có thể null.
- 1 hoặc nhiều (mandatory participation – bắt buộc có): Column FK not null + có hoặc không có UK
Tùy vào hoàn cảnh chúng ta lựa chọn rằng buộc phù hợp.