Tìm hiểu cách mô hình quan hệ của Edgar F. Codd biến dữ liệu thành bảng, khóa và quy tắc—mở đường cho cơ sở dữ liệu SQL vận hành phần mềm doanh nghiệp.

Ở mức đơn giản nhất, mô hình quan hệ lưu thông tin dưới dạng một tập bảng (Codd gọi là “relations”) có thể liên kết với nhau thông qua các giá trị chung.
Một bảng là một lưới gọn gàng:
Dữ liệu doanh nghiệp hiếm khi đứng riêng lẻ. Một giao dịch bán hàng liên quan đến khách hàng, sản phẩm, giá cả, nhân viên bán hàng và ngày tháng—mỗi thứ thay đổi với tốc độ khác nhau và thuộc các đội khác nhau. Các hệ thống sớm thường lưu những chi tiết này trong cấu trúc bó buộc, khó thay đổi. Điều đó làm cho báo cáo chậm, thay đổi rủi ro và các “câu hỏi đơn giản” trở nên đắt đỏ.
Mô hình quan hệ đưa ra cách tiếp cận rõ ràng hơn: giữ bảng riêng cho từng khái niệm, rồi kết nối khi cần trả lời. Thay vì nhân bản thông tin khách hàng trên mọi hoá đơn, bạn lưu khách hàng một lần và tham chiếu từ hoá đơn. Điều này giảm mâu thuẫn (hai cách viết khác nhau cho cùng một khách hàng) và khiến cập nhật dễ dự đoán hơn.
Bằng cách nhấn mạnh bảng rõ ràng và quy tắc kết nối, mô hình đặt ra một kỳ vọng mới: cơ sở dữ liệu nên giúp ngăn mâu thuẫn khi hệ thống lớn lên—đặc biệt khi nhiều người và hệ thống cùng ghi vào nó.
Mô hình của Codd không phải ngôn ngữ truy vấn, nhưng đã truyền cảm hứng cho một ngôn ngữ. Nếu dữ liệu nằm trong các bảng liên quan, bạn cần một cách chuẩn để:
Con đường đó dẫn tới SQL, ngôn ngữ biến mô hình thành cách thực tế để các nhóm hàng ngày đặt câu hỏi về dữ liệu doanh nghiệp và nhận câu trả lời có thể lặp lại, kiểm toán được.
Trước mô hình quan hệ, nhiều tổ chức lưu thông tin quan trọng trong file—thường một file cho mỗi ứng dụng. Bảng lương có file riêng, tồn kho có file khác, dịch vụ khách hàng có một bản “khách hàng” khác. Mỗi hệ thống hoạt động tách rời, và sự tách rời đó tạo ra những khó khăn dễ đoán.
Quá trình xử lý dữ liệu sớm thường xây dựng quanh định dạng file tuỳ chỉnh và chương trình viết cho mục đích riêng. Cấu trúc dữ liệu (trường nằm ở đâu, bản ghi sắp xếp thế nào) gắn chặt với mã đọc nó. Điều đó có nghĩa là ngay cả thay đổi nhỏ—thêm trường mới, đổi tên hạng mục, thay định dạng địa chỉ—cũng có thể yêu cầu viết lại nhiều chương trình.
Vì các nhóm không thể chia sẻ một nguồn chân lý duy nhất, họ sao chép dữ liệu. Địa chỉ khách hàng có thể tồn tại trong file bán hàng, file vận chuyển và file thanh toán.
Khi địa chỉ thay đổi, mọi bản sao đều phải cập nhật. Nếu một hệ thống bị bỏ sót, mâu thuẫn xuất hiện: hoá đơn gửi nhầm nơi, hàng giao trễ, và nhân viên hỗ trợ thấy “sự thật” khác nhau tuỳ màn hình. Dọn dẹp dữ liệu trở thành dự án định kỳ thay vì sửa một lần.
Người dùng doanh nghiệp vẫn đặt câu hỏi—“Khách hàng nào mua sản phẩm X rồi sau đó trả lại?”—nhưng trả lời đòi hỏi ghép các file vốn không thiết kế để kết hợp. Các nhóm thường tạo trích xuất báo cáo một lần, tạo thêm bản sao và nhiều cơ hội sai lệch.
Kết quả: chu kỳ báo cáo chậm, và các “câu hỏi nhanh” trở thành công việc của kỹ sư.
Các tổ chức cần dữ liệu chia sẻ mà nhiều ứng dụng có thể dựa vào, với ít mâu thuẫn và ít công sức trùng lặp hơn. Họ cũng cần cách đặt câu hỏi mới mà không phải xây lại lưu trữ nền tảng mỗi lần. Khoảng trống đó tạo nền tảng cho ý tưởng then chốt của Codd: mô tả dữ liệu một cách nhất quán, độc lập với ứng dụng, để hệ thống có thể tiến hoá mà không làm vỡ sự thật họ phụ thuộc.
Edgar F. Codd là nhà khoa học máy tính người Anh, phần lớn sự nghiệp làm việc tại IBM, nghiên cứu cách tổ chức lưu trữ và truy xuất thông tin hiệu quả. Cuối thập niên 1960, hầu hết “hệ thống cơ sở dữ liệu” gần giống những ngăn hồ sơ được quản lý cẩn thận: dữ liệu lưu trong cấu trúc cứng nhắc, và thay đổi cấu trúc thường đồng nghĩa viết lại ứng dụng. Sự giòn đó làm các đội bực mình khi doanh nghiệp lớn lên và yêu cầu thay đổi.
Năm 1970, Codd công bố bài báo có tựa đề dài—“A Relational Model of Data for Large Shared Data Banks”—đề xuất một ý tưởng đơn giản bất ngờ: biểu diễn dữ liệu dưới dạng bảng liên quan, và dùng một tập phép toán chính thức để truy vấn và kết hợp chúng.
Ở mức cao, bài báo lập luận rằng:
Codd đặt đề xuất trên nền tảng toán học (lý thuyết tập hợp và logic). Điều đó không phải khoe học thuật—nó cung cấp cơ sở rõ ràng, có thể kiểm thử cho thiết kế cơ sở dữ liệu. Với mô hình chính thức, bạn có thể suy luận liệu truy vấn có đúng, hai truy vấn có tương đương không, và cách tối ưu hoá thực thi mà không thay đổi kết quả. Với phần mềm doanh nghiệp, điều này chuyển thành ít bất ngờ hơn khi hệ thống mở rộng và tiến hoá.
Khi đó, nhiều hệ thống dựa trên mô hình phân cấp hoặc mạng, nơi lập trình viên “dò” dữ liệu theo đường dẫn định trước. Codd thách thức quan điểm đó bằng cách nói rằng cơ sở dữ liệu nên làm phần nặng. Ứng dụng không nên biết bố cục lưu trữ; ứng dụng nên mô tả kết quả mong muốn, và cơ sở dữ liệu tìm cách hiệu quả để tạo ra nó.
Sự tách biệt trách nhiệm đó chuẩn bị sân khấu cho SQL và cho các cơ sở dữ liệu sống sót qua nhiều năm thay đổi yêu cầu sản phẩm.
Mô hình quan hệ của Codd bắt đầu bằng ý tưởng đơn giản: lưu các sự thật trong relations—mà hầu hết nhận ra là các bảng—nhưng coi chúng là cách mô tả dữ liệu chính xác, không phải “bảng tính thông minh”. Relation là tập các mệnh đề về những thứ doanh nghiệp quan tâm: khách hàng, hoá đơn, thanh toán, sản phẩm, lô hàng.
Một relation đại diện cho một kiểu mẫu sự thật. Ví dụ, relation Orders có thể mô tả “một đơn hàng có ID, ngày, khách hàng và tổng tiền.” Điểm then chốt là mỗi relation có ý nghĩa rõ ràng, và mỗi cột là một phần của ý nghĩa đó.
Một hàng (Codd gọi là tuple) là một thể hiện cụ thể của sự thật đó: một đơn hàng cụ thể. Trong mô hình quan hệ, hàng không có “vị trí” cố định. Hàng thứ 5 không có gì đặc biệt—điều quan trọng là giá trị và các quy tắc định nghĩa chúng.
Một cột (một attribute) là một thuộc tính cụ thể trong relation: OrderDate, CustomerID, TotalAmount. Cột không chỉ là nhãn; nó định nghĩa loại giá trị được phép.
Một domain là tập giá trị cho phép cho một thuộc tính—ví dụ ngày cho OrderDate, số dương cho TotalAmount, hoặc danh sách mã kiểm soát cho Status (ví dụ Pending, Paid, Refunded). Domain giảm mơ hồ và ngăn các lỗi tinh vi như trộn các định dạng ngày khác nhau hoặc lưu “N/A” trong trường số.
“Relational” ám chỉ cách các sự thật được kết nối qua các relation (như khách hàng tới đơn hàng), cho phép các tác vụ doanh nghiệp phổ biến—lập hoá đơn, báo cáo, kiểm toán, hỗ trợ khách hàng—mà không sao chép cùng thông tin khắp nơi.
Bảng tự chúng đã hữu ích, nhưng dữ liệu doanh nghiệp chỉ có ý nghĩa khi bạn có thể kết nối các sự thật một cách đáng tin cậy: khách hàng nào đặt đơn nào, món nào có trong đơn, và tính phí bao nhiêu. Khóa là cơ chế làm cho những kết nối đó đáng tin.
Khóa chính là cột (hoặc tập cột) có giá trị xác định duy nhất một hàng. Hãy nghĩ nó như “thẻ tên” của hàng. Phần quan trọng là tính ổn định: tên, email và địa chỉ có thể thay đổi, nhưng ID nội bộ không nên.
Một khóa chính tốt ngăn trùng hoặc mơ hồ. Nếu hai khách hàng cùng tên, khóa chính vẫn phân biệt họ.
Khóa ngoại là cột lưu khóa chính từ bảng khác. Đó là cách biểu diễn quan hệ mà không sao chép toàn bộ dữ liệu.
Ví dụ, bạn có thể mô hình bán hàng như sau:
Ràng buộc khóa ngoại đóng vai trò như lan can. Chúng ngăn:
Về thực tế, khóa và ràng buộc cho phép các đội tin tưởng báo cáo và luồng công việc. Khi cơ sở dữ liệu cưỡng chế quan hệ, ít lỗi lọt vào hóa đơn, hoàn tất và hỗ trợ khách hàng—vì dữ liệu không thể lặng lẽ trôi về trạng thái bất khả thi.
Chuẩn hóa là cách mô hình quan hệ ngăn dữ liệu trôi vào mâu thuẫn khi nó lớn lên. Khi cùng một sự thật được lưu ở nhiều nơi, dễ cập nhật một bản sao mà quên bản kia. Đó là cách doanh nghiệp có hoá đơn gửi sai địa chỉ, báo cáo không khớp, hoặc khách hàng bị đánh dấu “inactive” ở màn hình này và “active” ở màn hình kia.
Ở mức thực tiễn, chuẩn hóa giảm các vấn đề phổ biến:
Nó cũng tránh anomaly chèn (không thể thêm khách hàng mới cho đến khi họ đặt đơn) và anomaly xóa (xóa đơn cuối cùng vô tình xóa bản sao duy nhất thông tin khách hàng).
Bạn không cần lý thuyết nặng để dùng ý tưởng tốt:
First Normal Form (1NF): giữ mỗi trường nguyên tử. Nếu khách hàng có nhiều số điện thoại, đừng nhồi chúng vào một ô; dùng bảng riêng hoặc hàng riêng để mỗi giá trị có thể tìm kiếm và cập nhật sạch sẽ.
Second Normal Form (2NF): nếu định danh bảng phụ thuộc vào hơn một cột (khóa tổ hợp), hãy đảm bảo các chi tiết không thuộc khóa phụ thuộc vào toàn bộ nó. Một dòng đơn hàng nên lưu số lượng và giá cho dòng đó, không lưu địa chỉ khách hàng.
Third Normal Form (3NF): tách những “sự thật phụ” thuộc nơi khác. Nếu một bảng lưu CustomerId và CustomerCity, thành phố thường nên nằm trong bảng khách hàng, không sao chép vào mọi đơn hàng.
Chuẩn hóa càng nhiều thường tạo nhiều bảng và nhiều join. Điều đó cải thiện tính nhất quán, nhưng có thể làm báo cáo phức tạp và đôi khi ảnh hưởng hiệu năng. Nhiều đội nhắm tới 3NF cho các thực thể lõi (customers, products, invoices), rồi chọn denormalize có chủ ý cho dashboard đọc nhiều—nhưng vẫn giữ một nguồn sự thật độc lập được cưỡng chế bởi khóa chính / khóa ngoại.
Đại số quan hệ là “toán” đằng sau mô hình quan hệ: một tập phép toán nhỏ, chính xác để biến một tập hàng (bảng) thành một tập hàng khác.
Sự chính xác đó quan trọng. Nếu quy tắc rõ ràng, kết quả truy vấn cũng rõ ràng. Bạn có thể dự đoán điều gì xảy ra khi lọc, chuyển hình hoặc kết hợp dữ liệu—mà không dựa vào hành vi không ghi chép hoặc dò thủ công.
Đại số quan hệ định nghĩa các khối xây dựng có thể ghép lại. Ba phép quan trọng là:
Select: chọn các hàng bạn muốn.
Ý tưởng: “Chỉ đơn hàng tháng trước” hoặc “Chỉ khách hàng ở Pháp.” Bạn giữ cùng cột nhưng giảm số hàng.
Project: chọn các cột bạn muốn.
Ý tưởng: “Hiện tên khách và email.” Bạn giữ cùng hàng (về mặt logic), nhưng bỏ các cột không cần.
Join: kết hợp các sự thật liên quan từ các bảng khác nhau.
Ý tưởng: “Gắn thông tin khách hàng vào từng đơn hàng,” dùng định danh chung như customer_id. Kết quả là một bảng mới nơi mỗi hàng gom các trường từng được lưu tách rời.
Dữ liệu doanh nghiệp tự nhiên phân tách theo chủ đề: khách hàng, đơn hàng, hoá đơn, sản phẩm, thanh toán. Sự tách này giữ mỗi sự thật lưu một lần (giúp tránh trùng lặp), nhưng cũng có nghĩa là câu trả lời thường cần kết hợp lại những sự thật đó.
Join là cách chính thức để kết hợp mà vẫn giữ ý nghĩa. Thay vì nhân bản tên khách vào mọi hàng đơn (và sau đó sửa lỗi chính tả khắp nơi), bạn lưu khách một lần và join khi cần báo cáo.
Vì đại số quan hệ được định nghĩa như các phép toán trên tập hàng, kết quả mong đợi của mỗi bước được xác định rõ:
Đây là xương sống khái niệm khiến SQL trở nên thực tế: truy vấn là chuỗi các biến đổi có xác định, không phải lấy dữ liệu ngẫu nhiên.
Mô hình của Codd mô tả ý nghĩa dữ liệu (relations, keys, operations) mà không đưa ra cách thân thiện để con người dùng hàng ngày. SQL lấp khoảng trống đó: nó biến ý tưởng quan hệ thành ngôn ngữ dễ đọc, mà các nhà phân tích, lập trình viên và sản phẩm cơ sở dữ liệu cùng chia sẻ.
SQL được truyền cảm hứng từ đại số quan hệ, nhưng không phải hiện thực hoàn hảo của lý thuyết gốc của Codd.
Một khác biệt là cách SQL xử lý giá trị thiếu hay không biết. Lý thuyết quan hệ cổ điển dựa trên logic hai giá trị (đúng/sai), còn SQL giới thiệu NULL, dẫn tới logic ba giá trị (đúng/sai/không biết). Khác nữa: lý thuyết quan hệ làm việc với tập hợp (không trùng), nhưng bảng SQL thường cho phép hàng trùng trừ khi bạn chặn chúng.
Dù khác biệt, SQL giữ lời hứa lõi: bạn mô tả kết quả muốn (truy vấn khai báo), và cơ sở dữ liệu tìm cách thực hiện hiệu quả.
Codd công bố bài báo nền tảng năm 1970. Trong thập niên 1970, IBM xây các prototype sớm (đáng chú ý là System R) chứng minh rằng cơ sở dữ liệu quan hệ có thể đạt hiệu năng đủ cho khối lượng thực và ngôn ngữ truy vấn cấp cao có thể biên dịch thành các kế hoạch thực thi hiệu quả.
Song song đó, nỗ lực học thuật và thương mại thúc đẩy SQL tiến lên. Đến cuối thập niên 1980, chuẩn hoá SQL (ANSI/ISO) giúp các nhà cung cấp hội tụ trên một ngôn ngữ chung—mặc dù mỗi sản phẩm vẫn có mở rộng riêng.
SQL hạ chi phí đặt câu hỏi. Thay vì viết chương trình tuỳ chỉnh cho mọi báo cáo, các đội có thể diễn đạt câu hỏi trực tiếp:
GROUP BYVới phần mềm doanh nghiệp, sự kết hợp join và aggregation của SQL là bước đột phá. Đội tài chính có thể đối chiếu hoá đơn với thanh toán; đội sản phẩm phân tích kênh chuyển đổi; đội vận hành giám sát tồn kho và hoàn tất—tất cả bằng truy vấn trên cùng mô hình dữ liệu có cấu trúc chia sẻ. Tính khả dụng này là lý do lớn khiến mô hình quan hệ rời khỏi thế giới nghiên cứu và trở thành công cụ hàng ngày.
Hệ thống doanh nghiệp sống hoặc chết bởi niềm tin. Không đủ để cơ sở dữ liệu “lưu dữ liệu”—nó phải giữ số dư chính xác, số lượng tồn kho đúng và dấu vết kiểm toán tin cậy ngay cả khi nhiều người dùng cùng thao tác.
Giao dịch gom một tập thay đổi thành một thao tác nghiệp vụ duy nhất. Nghĩ tới: “chuyển $100”, “giao một đơn”, hoặc “chốt bảng lương”. Mỗi thao tác chạm tới nhiều bảng và nhiều hàng.
Ý tưởng then chốt là hành vi tất cả hoặc không gì cả:
Đó là cách tránh tình huống tiền rời tài khoản này nhưng không tới tài khoản kia, hoặc giảm tồn kho mà không lưu đơn hàng.
ACID là viết tắt cho các đảm bảo mà doanh nghiệp dựa vào:
Ràng buộc (khóa chính, khóa ngoại, check) ngăn trạng thái không hợp lệ được ghi. Giao dịch đảm bảo các cập nhật liên quan qua bảng đến cùng lúc.
Trong thực tế: một đơn được lưu, dòng hàng được lưu, tồn kho giảm, và một bản ghi audit được viết—hoặc tất cả xảy ra, hoặc không có gì xảy ra. Sự kết hợp này cho phép cơ sở dữ liệu SQL hỗ trợ phần mềm doanh nghiệp nghiêm túc ở quy mô.
Cơ sở dữ liệu SQL không “thắng” vì hợp mốt—chúng phù hợp với cách hầu hết tổ chức nghĩ và vận hành. Một công ty đầy những thứ lặp lại, có cấu trúc: khách hàng, hoá đơn, sản phẩm, thanh toán, nhân viên. Mỗi thứ có tập thuộc tính rõ, và chúng liên quan theo cách dự đoán được. Mô hình quan hệ khớp tự nhiên với thực tế đó: một khách hàng có nhiều đơn, một đơn có dòng hàng, thanh toán khớp với hoá đơn.
Quy trình doanh nghiệp xây dựng quanh nhất quán và truy xuất nguồn gốc. Khi tài chính hỏi “Hoá đơn nào chưa thanh toán?”, hay hỗ trợ hỏi “Khách hàng này đang dùng gói nào?”, câu trả lời nên giống nhau dù công cụ hay đội nào hỏi. Cơ sở dữ liệu quan hệ thiết kế để lưu sự thật một lần và tham chiếu khắp nơi, giảm mâu thuẫn dẫn tới sửa đi sửa lại tốn kém.
Khi SQL phổ biến, một hệ sinh thái quanh nó xuất hiện: công cụ báo cáo, BI, ETL, connector và đào tạo. Tính tương thích đó giảm chi phí triển khai. Nếu dữ liệu của bạn nằm trong cơ sở dữ liệu quan hệ, thường dễ dàng kết nối vào các quy trình báo cáo và phân tích phổ biến mà không cần glue code tuỳ chỉnh.
Ứng dụng tiến hoá nhanh—tính năng mới, giao diện mới, tích hợp mới. Một schema thiết kế tốt giống hợp đồng bền: ngay cả khi dịch vụ và màn hình thay đổi, bảng lõi và quan hệ giữ nghĩa dữ liệu ổn định. Sự ổn định này là lý do lớn khiến cơ sở dữ liệu SQL trở thành trung tâm đáng tin cậy của phần mềm doanh nghiệp.
Schema không chỉ tổ chức dữ liệu—chúng làm rõ vai trò. Các đội có thể đồng ý “Khách hàng” là gì, trường nào bắt buộc, và cách bản ghi liên kết. Với khóa chính và khóa ngoại, trách nhiệm trở nên rõ ràng: ai tạo bản ghi, ai cập nhật, và gì phải giữ nhất quán trên doanh nghiệp.
Cơ sở dữ liệu quan hệ chiếm vị trí nhờ tính dự đoán và an toàn, nhưng không phù hợp cho mọi khối lượng công việc. Nhiều phê phán về hệ thống SQL thực ra là phê phán dùng một công cụ cho mọi việc.
Schema quan hệ là một hợp đồng: bảng, cột, kiểu và ràng buộc định nghĩa “dữ liệu hợp lệ”. Điều đó tốt cho sự hiểu chung, nhưng có thể làm chậm đội khi sản phẩm còn nhanh thay đổi.
Nếu bạn phát hành trường mới hàng tuần, điều phối migration, backfill và triển khai có thể trở thành nút thắt. Ngay cả với công cụ tốt, thay đổi schema cần lên kế hoạch—đặc biệt khi bảng lớn hoặc hệ thống phải luôn trực.
“NoSQL” không phải là phản đối hoàn toàn ý tưởng quan hệ mà là phản ứng với các điểm đau cụ thể:
Nhiều hệ thống này đánh đổi tính nhất quán chặt chẽ hoặc join phong phú để đổi lấy tốc độ, linh hoạt hoặc phân phối.
Phần lớn stack hiện đại đa dạng: cơ sở dữ liệu quan hệ cho bản ghi lõi, cùng luồng sự kiện, chỉ mục tìm kiếm, cache, hoặc document store cho nội dung và phân tích. Mô hình quan hệ vẫn là nguồn sự thật, trong khi các kho khác phục vụ truy vấn đọc nhiều hoặc chuyên biệt.
Khi chọn, tập trung vào:
Mặc định tốt là SQL cho dữ liệu lõi, rồi thêm lựa chọn khác chỉ khi mô hình quan hệ rõ ràng là giới hạn.
Mô hình quan hệ của Codd không chỉ là lịch sử—đó là tập thói quen giúp dữ liệu doanh nghiệp dễ tin cậy, thay đổi và báo cáo. Ngay cả khi app của bạn dùng nhiều hệ lưu trữ, tư duy quan hệ vẫn là mặc định mạnh cho “hệ thống ghi chép” (orders, invoices, customers, inventory).
Bắt đầu bằng cách mô hình các danh từ thực tế doanh nghiệp bạn quan tâm như bảng (Customers, Orders, Payments), rồi dùng quan hệ để nối chúng.
Một vài quy tắc ngăn hầu hết đau đầu sau này:
phone1, phone2, phone3).Nếu bạn biến nguyên tắc thành sản phẩm thực tế, có công cụ giúp đồng bộ ý định schema và mã ứng dụng. Ví dụ, Koder.ai có thể sinh app React + Go + PostgreSQL từ prompt chat, giúp bạn prototype schema chuẩn hóa (bảng, khóa, quan hệ) và lặp nhanh—vẫn giữ DB là nguồn sự thật và cho phép xuất mã nguồn khi bạn muốn toàn quyền kiểm soát.
Nếu dữ liệu yêu cầu đảm bảo đúng đắn mạnh, hỏi:
Nếu thường trả lời “có”, DB quan hệ thường là đường đơn giản nhất.
“SQL không thể scale” là quá rộng. Hệ thống SQL scale theo nhiều cách (index, cache, bản sao đọc, sharding khi cần). Hầu hết đội gặp vấn đề mô hình và truy vấn trước khi chạm tới giới hạn DB thật sự.
“Chuẩn hóa làm mọi thứ chậm” cũng chưa đầy đủ. Chuẩn hóa giảm bất thường; hiệu năng quản lý bằng index, thiết kế truy vấn và denormalize có chọn lọc khi đo đạc cho thấy cần.
Codd trao cho các đội một hợp đồng chung: dữ liệu sắp xếp trong các bảng liên quan, thao tác bằng các phép biến đổi rõ ràng, và bảo vệ bằng ràng buộc. Hợp đồng đó là lý do phần mềm hàng ngày có thể tiến hoá nhiều năm mà vẫn trả lời những câu hỏi cơ bản như “điều gì đã xảy ra, khi nào và vì sao?”
Mô hình quan hệ lưu trữ dữ liệu dưới dạng bảng (relations) với:
Lợi ích chính là các bảng riêng biệt có thể liên kết bằng các định danh chung, nên bạn lưu mỗi sự thật một lần và kết hợp lại khi cần báo cáo hoặc quy trình.
Các hệ thống kiểu file gắn chặt cấu trúc dữ liệu vào mã ứng dụng. Điều này tạo ra các vấn đề thực tế:
Cơ sở dữ liệu quan hệ tách định nghĩa dữ liệu khỏi từng ứng dụng và làm cho việc truy vấn chung trở nên bình thường.
Một khóa chính (PK) xác định duy nhất mỗi hàng trong bảng và nên ổn định theo thời gian.
Hướng dẫn thực tế:
customer_id) hơn các trường có thể thay đổi như email.Một khóa ngoại (FK) là cột chứa giá trị phải khớp với khóa chính tồn tại trong bảng khác. Nó biểu diễn mối quan hệ mà không cần sao chép toàn bộ bản ghi.
Mẫu ví dụ:
orders.customer_id tham chiếu customers.customer_idKhi bật ràng buộc FK, cơ sở dữ liệu có thể ngăn:
Chuẩn hóa giảm sự mâu thuẫn bằng cách lưu mỗi sự thật một lần (hoặc càng gần một lần càng tốt). Nó giúp ngăn:
Một mục tiêu phổ biến là , rồi chỉ chọn denormalize khi có lý do đo đếm được.
Quy tắc 1NF: một trường, một giá trị.
Nếu bạn có phone1, phone2, phone3, hãy tách thành bảng liên quan:
customer_phones(customer_id, phone_number, type)Cách này giúp tìm kiếm, xác thực và cập nhật số điện thoại dễ dàng, tránh các cột trống hoặc mất tính linh hoạt.
Đại số quan hệ định nghĩa các phép toán lõi đằng sau truy vấn quan hệ:
Bạn không cần viết đại số quan hệ hàng ngày, nhưng hiểu các khái niệm này giúp suy luận về kết quả SQL và tránh nhân bản dữ liệu khi join.
SQL làm cho ý tưởng quan hệ dễ dùng bằng cách cung cấp cách mô tả kết quả: bạn nói bạn muốn gì, và cơ sở dữ liệu chọn kế hoạch thực thi.
Những lợi ích thực tế:
GROUP BY)Dù SQL không hoàn toàn “thuần” theo lý thuyết của Codd, nó giữ quy trình cốt lõi: truy vấn đáng tin trên các bảng liên quan.
SQL khác mô hình quan hệ “thuần” ở vài điểm:
NULL mang lại luật ba giá trị (true/false/unknown), ảnh hưởng đến lọc và join.Thực tế, bạn nên xử lý cẩn thận và áp ràng buộc tính duy nhất khi cần.
Dùng cơ sở dữ liệu quan hệ khi bạn cần ghi nhận chính xác các bản ghi nghiệp vụ chung.
Danh sách kiểm thực tế:
Cân nhắc NoSQL khi bạn cụ thể cần hình dạng dữ liệu linh hoạt, mô hình phân tán quy mô lớn, hoặc truy vấn chuyên biệt (search/graph). Nhưng giữ một hệ thống ghi chép chính nếu tính nhất quán quan trọng.
NULL