Quan hệ một-nhiều trong cơ sở dữ liệu: Hướng dẫn đầy đủ
Tìm hiểu quan hệ một-nhiều là gì, cách chúng liên kết các bảng bằng khóa, và vì sao chúng cần thiết cho thiết kế cơ sở dữ liệu quan hệ rõ ràng, đáng tin cậy.
Trong hướng dẫn này, tôi sẽ giải thích quan hệ một-nhiều là gì, cách triển khai trong thiết kế cơ sở dữ liệu, và những thực tiễn tốt nhất để giữ cho cơ sở dữ liệu của bạn có khả năng mở rộng và hiệu quả.
Quan hệ một-nhiều (1:N) mô tả tình huống trong đó một bản ghi ở một bảng có thể liên kết với nhiều bản ghi ở bảng khác. Nói đơn giản, một thực thể tồn tại một lần nhưng có thể được kết nối với nhiều thực thể liên quan.
Ví dụ, một khách hàng có thể đặt nhiều đơn hàng, nhưng mỗi đơn hàng chỉ thuộc về một khách hàng.
Bạn sẽ thường thấy quan hệ một-nhiều được mô tả bằng các thuật ngữ sau:
Bảng cha: Bảng chứa bản ghi “một”
Bảng con: Bảng chứa các bản ghi “nhiều”
Theo ví dụ trên, bản ghi khách hàng sẽ nằm ở bảng cha, và bảng đơn hàng sẽ là bảng con.
Tìm hiểu lực lượng (cardinality) trong quan hệ một-nhiều
Cardinality mô tả có bao nhiêu bản ghi có thể được kết nối giữa hai bảng. Nó trả lời các câu hỏi như:
Một khách hàng có thể có bao nhiêu đơn hàng?
Một khách hàng có thể tồn tại mà không có đơn hàng nào không?
Quan hệ một-nhiều là bất đối xứng, nghĩa là quy tắc khác nhau ở mỗi bảng. Ở bảng cha, một bản ghi có thể liên quan đến nhiều bản ghi, trong khi ở bảng con, mỗi bản ghi chỉ có thể liên quan đến một bản ghi duy nhất.
Cardinality cũng bao gồm giới hạn tối thiểu và tối đa, trong đó:
Cardinality tối thiểu: Số lượng ít nhất các bản ghi liên quan được phép.
Cardinality tối đa: Số lượng nhiều nhất các bản ghi liên quan được phép.
Ví dụ, một khách hàng có thể có không hoặc nhiều đơn hàng, nhưng một đơn hàng phải thuộc về đúng một khách hàng.
Những quy tắc này ảnh hưởng đến thiết kế bảng bằng cách cho biết liệu một số trường có thể để trống hay không, và cơ sở dữ liệu sẽ thực thi quan hệ chặt chẽ tới mức nào.
Trực quan hóa quan hệ một-nhiều với sơ đồ ER
Trong thiết kế cơ sở dữ liệu, sơ đồ Thực thể–Quan hệ (ER) là cách trực quan để thể hiện các bảng (thực thể), cách chúng được kết nối (quan hệ), và có bao nhiêu bản ghi có thể được liên kết (cardinality).
Ký hiệu sơ đồ ER
Hầu hết sơ đồ ER sử dụng các ký hiệu cụ thể ở hai đầu đường nối giữa các bảng để cho biết chính xác loại quan hệ. Dưới đây là các ký hiệu trực quan thường dùng cho:
Thực thể: Vẽ dưới dạng hình chữ nhật để biểu diễn các bảng như Customers hoặc Orders.
Quan hệ: Thể hiện bằng các đường nối giữa các thực thể để chỉ ra cách các thực thể liên quan với nhau
Ký hiệu cardinality: Số 1 hoặc một đường đơn biểu thị phía “một”, trong khi ∞, *, hoặc chân quạ biểu thị phía “nhiều”.
Ví dụ sơ đồ ER đơn giản
Ví dụ dưới đây cho thấy quan hệ giữa bảng Customers và Orders. Quan hệ một-nhiều cho thấy một khách hàng có thể có nhiều đơn hàng, nhưng mỗi đơn hàng thuộc về một khách hàng. CustomerID xuất hiện trong bảng Orders để liên kết ngược về bảng Customers.
Các ví dụ phổ biến về quan hệ một-nhiều
Dưới đây là các kịch bản quan hệ một-nhiều mà bạn có thể gặp:
Tác giả → Sách: Một tác giả có thể viết nhiều cuốn sách, nhưng mỗi cuốn (trong thiết kế đơn giản) chỉ có một tác giả.
Phòng ban → Nhân viên: Một phòng ban có thể có nhiều nhân viên, nhưng mỗi nhân viên thuộc về một phòng ban
Danh mục → Sản phẩm: Một danh mục có thể chứa nhiều sản phẩm, nhưng mỗi sản phẩm được gán vào một danh mục.
Triển khai quan hệ một-nhiều trong cơ sở dữ liệu quan hệ
Quan hệ một-nhiều được triển khai bằng khóa chính và khóa ngoại. Trong phần này, tôi sẽ cho bạn thấy cách các ràng buộc này giúp đảm bảo toàn vẹn dữ liệu trong cơ sở dữ liệu.
Khóa chính và khóa ngoại
Khóa chính là cột định danh duy nhất cho mỗi hàng trong bảng, còn khóa ngoại là một trường hoặc tập trường trong một bảng tham chiếu đến khóa chính ở bảng khác.
Trong một quan hệ một-nhiều, phía “một” có khóa chính, và bảng “nhiều” lưu khóa đó như một khóa ngoại. Khóa ngoại tạo liên kết giữa hai bảng và đảm bảo mỗi bản ghi ở phía “nhiều” trỏ tới một bản ghi hợp lệ ở phía “một”.
Ví dụ SQL cơ bản
Hãy xem cách bạn xây dựng quan hệ một-nhiều trong SQL bằng ví dụ dưới đây.
Bạn sẽ tạo bảng Customers trong đó CustomerID định danh duy nhất mỗi khách hàng. Đây là bảng cha.
-- Create Customers table with CustomerID as primary keyCREATETABLE Customers (
CustomerID INTPRIMARYKEY,
CustomerName VARCHAR(100));Được hỗ trợ bởi
Bây giờ tạo bảng Orders nơi CustomerID là khóa ngoại. Trong bảng này, mỗi đơn hàng tham chiếu chính xác một khách hàng và là bảng con.
-- Create Orders table with CustomerID as a foreign keyCREATETABLE Orders (
OrderID INTPRIMARYKEY,
OrderDate DATE,
CustomerID INT,FOREIGNKEY(CustomerID)REFERENCES Customers(CustomerID));Được hỗ trợ bởi
Một-nhiều so với Nhiều-nhiều
Hiểu sự khác biệt giữa một-nhiều và nhiều-nhiều rất quan trọng để thiết kế cơ sở dữ liệu đúng. Bảng dưới đây tóm tắt các khác biệt này:
Khía cạnh
Quan hệ Một-nhiều
Quan hệ Nhiều-nhiều
Định nghĩa
Một bản ghi ở Bảng A có thể liên quan đến nhiều bản ghi ở Bảng B
Các bản ghi ở Bảng A có thể liên quan đến nhiều bản ghi ở Bảng B, và ngược lại
Hướng quan hệ
Một → Nhiều (một chiều)
Nhiều ↔ Nhiều (hai chiều)
Quy tắc ở Bảng B
Mỗi bản ghi ở Bảng B chỉ liên quan đến một bản ghi ở Bảng A
Mỗi bản ghi ở Bảng B có thể liên quan đến nhiều bản ghi ở Bảng A
Ví dụ phổ biến
Customer → OrdersDepartment → Employees
Students ↔ CoursesProducts ↔ Orders
Ý nghĩa thực tế
Một khách hàng có thể đặt nhiều đơn hàng, nhưng mỗi đơn hàng thuộc về một khách hàng
Một sinh viên có thể đăng ký nhiều học phần, và mỗi học phần có thể có nhiều sinh viên
Triển khai
Một khóa ngoại ở phía “nhiều”
Cần một bảng nối (junction)
Vị trí khóa ngoại
Được lưu trong bảng “nhiều”
Được lưu trong bảng nối (hai khóa ngoại)
Điều quan trọng cần lưu ý là cơ sở dữ liệu quan hệ không thể lưu trực tiếp quan hệ nhiều-nhiều chỉ bằng một khóa ngoại. Thay vào đó, chúng sử dụng bảng nối (còn gọi là bảng trung gian hoặc cầu nối).
Ví dụ, bạn có thể liên kết an toàn các bản ghi trong bảng Students với bảng Courses bằng bảng Enrollments làm bảng nối. Bảng nối phân rã quan hệ nhiều-nhiều thành hai quan hệ một-nhiều, nên lưu khóa ngoại tới cả hai bảng. Thiết kế này giúp chuẩn hóa cơ sở dữ liệu, duy trì hiệu suất.
Tôi khuyên bạn học khóa Kết hợp dữ liệu trong SQL để học các loại phép nối trong SQL và cách làm việc với các bảng liên quan khác nhau trong cơ sở dữ liệu.
Những sai sót thường gặp với quan hệ một-nhiều
Dưới đây là một số vấn đề thường gặp trong quan hệ một-nhiều và cách xử lý:
Đặt khóa ngoại sai bảng: Khi bạn lưu khóa ngoại ở bảng “một” thay vì bảng “nhiều”, bạn sẽ phải lưu nhiều giá trị trong một cột hoặc lặp lại cột, phá vỡ chuẩn hóa và khiến việc truy vấn trở nên khó khăn. Để khắc phục, luôn đặt khóa ngoại ở phía “nhiều” của quan hệ.
Nhầm lẫn Một-nhiều với Nhiều-nhiều: Nếu bạn mô hình hóa quan hệ là một-nhiều trong khi cả hai phía thực tế có thể có nhiều bản ghi liên quan, điều đó có thể dẫn đến thiếu dữ liệu, trùng lặp hàng, hoặc thiết kế cứng nhắc không thể mở rộng theo yêu cầu. Cách sửa là luôn xác nhận xem một bản ghi con có thể có nhiều bản ghi liên quan hay không; nếu có, hãy dùng bảng nối.
Vô tình cho phép bản ghi mồ côi: Để bản ghi con tồn tại mà không có bản ghi cha hợp lệ có thể tạo dữ liệu không nhất quán, như đơn hàng không có khách hàng hoặc nhân viên không có phòng ban. Để giải quyết, hãy dùng các ràng buộc khóa ngoại nhưON DELETE CASCADE để cơ sở dữ liệu tự động thực thi quan hệ hợp lệ.
Thực tiễn tốt nhất khi thiết kế quan hệ một-nhiều
Tôi khuyến nghị các thực tiễn dưới đây như kim chỉ nam giúp bạn thiết kế quan hệ một-nhiều hiệu quả và có khả năng mở rộng:
Đặt tên rõ ràng và nhất quán: Đặt tên khóa chính có quy luật, như CustomerID và OrderID. Tên rõ ràng giúp nhận diện quan hệ mà không cần sơ đồ và hữu ích khi khớp tên khóa ngoại với khóa chính được tham chiếu.
Thực thi ràng buộc khóa ngoại: Sử dụng khóa ngoại để cơ sở dữ liệu bảo vệ toàn vẹn dữ liệu và ngăn các bản ghi không hợp lệ hoặc mồ côi, đặc biệt khi dữ liệu tăng trưởng.
Sớm xem xét hành vi xóa: Bạn có thể quyết định điều gì sẽ xảy ra với các bản ghi con khi bản ghi cha bị xóa để tránh mất dữ liệu ngoài ý muốn hoặc tham chiếu hỏng. Ví dụ, CASCADE đảm bảo tất cả bản ghi con bị xóa khi bản ghi cha bị xóa.
Giữ thiết kế đơn giản: Luôn tránh các bảng không cần thiết hoặc quan hệ phức tạp, và giữ thiết kế đúng với mô hình bạn cần bây giờ, không phải cho các trường hợp giả định tương lai. Hãy nhớ rằng thiết kế đơn giản dễ bảo trì, giải thích và mở rộng hơn.
Kết luận
Quan hệ một-nhiều mô tả cách một bản ghi duy nhất ở một bảng có thể gắn với nhiều bản ghi ở bảng khác, trong khi mỗi bản ghi liên quan đó chỉ thuộc về một bản ghi cha. Mẫu này là nền tảng trong thiết kế cơ sở dữ liệu quan hệ vì nó giữ dữ liệu có tổ chức và ngăn trùng lặp không cần thiết.
Tôi khuyến nghị lộ trình nghề nghiệp Associate Data Engineer in SQL để học cách thiết kế cơ sở dữ liệu trong SQL nhằm xử lý, lưu trữ và tổ chức dữ liệu hiệu quả. Ngoài ra, nếu bạn muốn nâng cao kỹ năng quản trị cơ sở dữ liệu cho dữ liệu lớn, khóa Giới thiệu về Mô hình dữ liệu trong Snowflake sẽ giúp bạn về mô hình dữ liệu chiều.
Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.
Câu hỏi thường gặp
Quan hệ một-nhiều khác gì so với nhiều-nhiều?⌄
Trong quan hệ một-nhiều, chỉ một phía có thể có nhiều bản ghi liên quan; trong quan hệ nhiều-nhiều, cả hai phía đều có thể, và cần một bảng nối.
Bảng nào giữ khóa ngoại trong quan hệ một-nhiều?⌄
Khóa ngoại được lưu trong bảng ở phía “nhiều” của quan hệ.
Một quan hệ một-nhiều có thể tồn tại mà không có khóa ngoại không?⌄
Về mặt khái niệm là có thể, nhưng trong thực tiễn, rất nên dùng khóa ngoại để thực thi toàn vẹn dữ liệu và ngăn bản ghi không hợp lệ.
Làm sao biết mô hình dữ liệu của tôi nên là một-nhiều hay nhiều-nhiều?⌄
Hãy hỏi liệu cả hai phía có thể có nhiều bản ghi liên quan không. Nếu có, đó là nhiều-nhiều; nếu không, đó là một-nhiều.
Cardinality trong các quan hệ là gì?⌄
Cardinality mô tả mối quan hệ định lượng giữa hai bảng. Trong quan hệ 1:N, cardinality là một ở phía bảng cha và nhiều ở phía bảng con.
Trong hướng dẫn này, tôi sẽ giải thích quan hệ một-nhiều là gì, cách triển khai trong thiết kế cơ sở dữ liệu, và những thực tiễn tốt nhất để giữ cho cơ sở dữ liệu của bạn có khả năng mở rộng và hiệu quả.
Nếu bạn mới bắt đầu với vai trò kỹ sư cơ sở dữ liệu, tôi khuyên bạn nên học các khóa Giới thiệu về Cơ sở dữ liệu quan hệ trong SQL và Thiết kế Cơ sở dữ liệu để học cách tạo quan hệ khi định nghĩa lược đồ cơ sở dữ liệu của bạn.
Quan hệ một-nhiều là gì?
Quan hệ một-nhiều (1:N) mô tả tình huống trong đó một bản ghi ở một bảng có thể liên kết với nhiều bản ghi ở bảng khác. Nói đơn giản, một thực thể tồn tại một lần nhưng có thể được kết nối với nhiều thực thể liên quan.
Ví dụ, một khách hàng có thể đặt nhiều đơn hàng, nhưng mỗi đơn hàng chỉ thuộc về một khách hàng.
Bạn sẽ thường thấy quan hệ một-nhiều được mô tả bằng các thuật ngữ sau:
Theo ví dụ trên, bản ghi khách hàng sẽ nằm ở bảng cha, và bảng đơn hàng sẽ là bảng con.
Tìm hiểu lực lượng (cardinality) trong quan hệ một-nhiều
Cardinality mô tả có bao nhiêu bản ghi có thể được kết nối giữa hai bảng. Nó trả lời các câu hỏi như:
Quan hệ một-nhiều là bất đối xứng, nghĩa là quy tắc khác nhau ở mỗi bảng. Ở bảng cha, một bản ghi có thể liên quan đến nhiều bản ghi, trong khi ở bảng con, mỗi bản ghi chỉ có thể liên quan đến một bản ghi duy nhất.
Cardinality cũng bao gồm giới hạn tối thiểu và tối đa, trong đó:
Ví dụ, một khách hàng có thể có không hoặc nhiều đơn hàng, nhưng một đơn hàng phải thuộc về đúng một khách hàng.
Những quy tắc này ảnh hưởng đến thiết kế bảng bằng cách cho biết liệu một số trường có thể để trống hay không, và cơ sở dữ liệu sẽ thực thi quan hệ chặt chẽ tới mức nào.
Trực quan hóa quan hệ một-nhiều với sơ đồ ER
Trong thiết kế cơ sở dữ liệu, sơ đồ Thực thể–Quan hệ (ER) là cách trực quan để thể hiện các bảng (thực thể), cách chúng được kết nối (quan hệ), và có bao nhiêu bản ghi có thể được liên kết (cardinality).
Ký hiệu sơ đồ ER
Hầu hết sơ đồ ER sử dụng các ký hiệu cụ thể ở hai đầu đường nối giữa các bảng để cho biết chính xác loại quan hệ. Dưới đây là các ký hiệu trực quan thường dùng cho:
CustomershoặcOrders.1hoặc một đường đơn biểu thị phía “một”, trong khi∞,*, hoặc chân quạ biểu thị phía “nhiều”.Ví dụ sơ đồ ER đơn giản
Ví dụ dưới đây cho thấy quan hệ giữa bảng
CustomersvàOrders. Quan hệ một-nhiều cho thấy một khách hàng có thể có nhiều đơn hàng, nhưng mỗi đơn hàng thuộc về một khách hàng.CustomerIDxuất hiện trong bảngOrdersđể liên kết ngược về bảngCustomers.Các ví dụ phổ biến về quan hệ một-nhiều
Dưới đây là các kịch bản quan hệ một-nhiều mà bạn có thể gặp:
Triển khai quan hệ một-nhiều trong cơ sở dữ liệu quan hệ
Quan hệ một-nhiều được triển khai bằng khóa chính và khóa ngoại. Trong phần này, tôi sẽ cho bạn thấy cách các ràng buộc này giúp đảm bảo toàn vẹn dữ liệu trong cơ sở dữ liệu.
Khóa chính và khóa ngoại
Khóa chính là cột định danh duy nhất cho mỗi hàng trong bảng, còn khóa ngoại là một trường hoặc tập trường trong một bảng tham chiếu đến khóa chính ở bảng khác.
Trong một quan hệ một-nhiều, phía “một” có khóa chính, và bảng “nhiều” lưu khóa đó như một khóa ngoại. Khóa ngoại tạo liên kết giữa hai bảng và đảm bảo mỗi bản ghi ở phía “nhiều” trỏ tới một bản ghi hợp lệ ở phía “một”.
Ví dụ SQL cơ bản
Hãy xem cách bạn xây dựng quan hệ một-nhiều trong SQL bằng ví dụ dưới đây.
Bạn sẽ tạo bảng
Customerstrong đóCustomerIDđịnh danh duy nhất mỗi khách hàng. Đây là bảng cha.Bây giờ tạo bảng
OrdersnơiCustomerIDlà khóa ngoại. Trong bảng này, mỗi đơn hàng tham chiếu chính xác một khách hàng và là bảng con.Một-nhiều so với Nhiều-nhiều
Hiểu sự khác biệt giữa một-nhiều và nhiều-nhiều rất quan trọng để thiết kế cơ sở dữ liệu đúng. Bảng dưới đây tóm tắt các khác biệt này:
Khía cạnh
Quan hệ Một-nhiều
Quan hệ Nhiều-nhiều
Định nghĩa
Một bản ghi ở Bảng A có thể liên quan đến nhiều bản ghi ở Bảng B
Các bản ghi ở Bảng A có thể liên quan đến nhiều bản ghi ở Bảng B, và ngược lại
Hướng quan hệ
Một → Nhiều (một chiều)
Nhiều ↔ Nhiều (hai chiều)
Quy tắc ở Bảng B
Mỗi bản ghi ở Bảng B chỉ liên quan đến một bản ghi ở Bảng A
Mỗi bản ghi ở Bảng B có thể liên quan đến nhiều bản ghi ở Bảng A
Ví dụ phổ biến
Customer → OrdersDepartment → Employees
Students ↔ CoursesProducts ↔ Orders
Ý nghĩa thực tế
Một khách hàng có thể đặt nhiều đơn hàng, nhưng mỗi đơn hàng thuộc về một khách hàng
Một sinh viên có thể đăng ký nhiều học phần, và mỗi học phần có thể có nhiều sinh viên
Triển khai
Một khóa ngoại ở phía “nhiều”
Cần một bảng nối (junction)
Vị trí khóa ngoại
Được lưu trong bảng “nhiều”
Được lưu trong bảng nối (hai khóa ngoại)
Điều quan trọng cần lưu ý là cơ sở dữ liệu quan hệ không thể lưu trực tiếp quan hệ nhiều-nhiều chỉ bằng một khóa ngoại. Thay vào đó, chúng sử dụng bảng nối (còn gọi là bảng trung gian hoặc cầu nối).
Ví dụ, bạn có thể liên kết an toàn các bản ghi trong bảng
Studentsvới bảngCoursesbằng bảngEnrollmentslàm bảng nối. Bảng nối phân rã quan hệ nhiều-nhiều thành hai quan hệ một-nhiều, nên lưu khóa ngoại tới cả hai bảng. Thiết kế này giúp chuẩn hóa cơ sở dữ liệu, duy trì hiệu suất.Tôi khuyên bạn học khóa Kết hợp dữ liệu trong SQL để học các loại phép nối trong SQL và cách làm việc với các bảng liên quan khác nhau trong cơ sở dữ liệu.
Những sai sót thường gặp với quan hệ một-nhiều
Dưới đây là một số vấn đề thường gặp trong quan hệ một-nhiều và cách xử lý:
Thực tiễn tốt nhất khi thiết kế quan hệ một-nhiều
Tôi khuyến nghị các thực tiễn dưới đây như kim chỉ nam giúp bạn thiết kế quan hệ một-nhiều hiệu quả và có khả năng mở rộng:
Đặt tên rõ ràng và nhất quán: Đặt tên khóa chính có quy luật, như
CustomerIDvàOrderID. Tên rõ ràng giúp nhận diện quan hệ mà không cần sơ đồ và hữu ích khi khớp tên khóa ngoại với khóa chính được tham chiếu.Thực thi ràng buộc khóa ngoại: Sử dụng khóa ngoại để cơ sở dữ liệu bảo vệ toàn vẹn dữ liệu và ngăn các bản ghi không hợp lệ hoặc mồ côi, đặc biệt khi dữ liệu tăng trưởng.
Sớm xem xét hành vi xóa: Bạn có thể quyết định điều gì sẽ xảy ra với các bản ghi con khi bản ghi cha bị xóa để tránh mất dữ liệu ngoài ý muốn hoặc tham chiếu hỏng. Ví dụ,
CASCADEđảm bảo tất cả bản ghi con bị xóa khi bản ghi cha bị xóa.Giữ thiết kế đơn giản: Luôn tránh các bảng không cần thiết hoặc quan hệ phức tạp, và giữ thiết kế đúng với mô hình bạn cần bây giờ, không phải cho các trường hợp giả định tương lai. Hãy nhớ rằng thiết kế đơn giản dễ bảo trì, giải thích và mở rộng hơn.
Kết luận
Quan hệ một-nhiều mô tả cách một bản ghi duy nhất ở một bảng có thể gắn với nhiều bản ghi ở bảng khác, trong khi mỗi bản ghi liên quan đó chỉ thuộc về một bản ghi cha. Mẫu này là nền tảng trong thiết kế cơ sở dữ liệu quan hệ vì nó giữ dữ liệu có tổ chức và ngăn trùng lặp không cần thiết.
Tôi khuyến nghị lộ trình nghề nghiệp Associate Data Engineer in SQL để học cách thiết kế cơ sở dữ liệu trong SQL nhằm xử lý, lưu trữ và tổ chức dữ liệu hiệu quả. Ngoài ra, nếu bạn muốn nâng cao kỹ năng quản trị cơ sở dữ liệu cho dữ liệu lớn, khóa Giới thiệu về Mô hình dữ liệu trong Snowflake sẽ giúp bạn về mô hình dữ liệu chiều.