Quan hệ nhiều nhiều

Quan hệ nhiều nhiều (many to many) tức là một record của bảng này có quan hệ với nhiều record trong bảng khác và ngược lại.

Ví dụ:

  • Một thành phố có nhiều con sông, và một con sông có thể chảy qua nhiều thành phố.
  • Một hóa đơn (Order) có nhiều sản phẩm (Item), và một sản phẩm có thể thuộc nhiều đơn hàng.

Để thể hiện một mối quan hệ nhiều nhiều, bạn cần tạo thêm một bảng phụ.

Ví dụ: Tạo một database gồm các bảng thể hiện được mối quan hệ sau, Một hóa đơn (Order) có nhiều sản phẩm (Item), và một sản phẩm có thể thuộc nhiều hóa đơn.

Đây là quan hệ nhiều nhiều, để giải quyết bài toán này, chúng ta cần thêm một bảng phụ chứa khóa ngoại của hai bảng. Nếu không tạo thêm bảng phụ mà đặt khóa ngoại vào một trong hai bảng sẽ dẫn đến quan hệ một nhiều.

quan hệ một nhiều

Điều này là sai với yêu cầu bài toán đưa ra, do vậy ta cần tạo một bảng phụ là ItemOrders để chứa khóa ngoại của hai bảng.

Bạn có thể hình dung như sau.

bảng phụ

SQL Code:

--Sử dụng database Master
USE master
--Kiểm tra database có tồn tại hay không mới xóa
IF EXISTS(select * from sys.databases WHERE name='Test')
DROP DATABASE Test
CREATE DATABASE Test 

GO 

USE Test;

--Tạo bảng Orders 
CREATE TABLE Orders 
  ( 
     OrderId int PRIMARY KEY IDENTITY( 1, 1 ), 
     Name    varchar(50) NOT NULL 
  ); 

--Tạo bảng Items 
CREATE TABLE Items 
  ( 
     ItemId int PRIMARY KEY IDENTITY( 1, 1 ), 
     Name   varchar(50) NOT NULL 
  ); 

--Tạo bảng phụ ItemOrders 
CREATE TABLE ItemOrders 
  ( 
     ItemId  int FOREIGN KEY REFERENCES Items( ItemId ), 
     OrderId int FOREIGN KEY REFERENCES Orders( OrderId ), 
     PRIMARY KEY( ItemId, OrderId ) 
  ); 

Ở ví dụ trên, ta đã tạo được bảng Orders và Items có quan hệ nhiều nhiều, bảng ItemOrders dùng để lưu giữ khóa ngoại tới bảng Orders và Items.
Nên nhớ, mỗi bảng đều nên có một khóa chính, ở bảng ItemOrders, dù là bảng trung gian nhưng ta vẫn thiết lập khóa chính cho 2 cột ItemId và OrderId. Điều này giúp chúng ta insert dữ liệu không sai, khi dữ liệu về một cặp Order và Item đã tồn tại trong hệ thống, thì không thể insert được nữa, chúng ta chỉ có thể thay đổi nó.

Tiến hành insert dữ liệu cho bảng Orders, Items.

INSERT INTO Orders 
VALUES      ( 'Order Name 1' ); 

INSERT INTO Orders 
VALUES      ( 'Order Name 2' ); 

GO 

INSERT INTO Items 
VALUES      ( 'Item 1' ); 

INSERT INTO Items 
VALUES      ( 'Item 2' ); 

INSERT INTO Items 
VALUES      ( 'Item 3' ); 

Bây giờ bạn đã khởi tạo xong dữ liệu cho bảng Orders và Items.

khởi tạo dữ liệu

Để tạo mối quan hệ giữa các Order và Item, tức là trong một hóa đơn có nhiều sản phẩm và ngược lại, chúng ta chỉ cần insert dữ liệu vào bảng ItemOrders.

INSERT INTO ItemOrders 
            (ItemId, 
             OrderId) 
VALUES      ( 1, 
              1 ); 

INSERT INTO ItemOrders 
            (ItemId, 
             OrderId) 
VALUES      ( 1, 
              2 ); 

INSERT INTO ItemOrders 
            (ItemId, 
             OrderId) 
VALUES      ( 2, 
              1 ); 

INSERT INTO ItemOrders 
            (ItemId, 
             OrderId) 
VALUES      ( 3, 
              2 ); 

Select dữ liệu từ bảng ItemOrders.

select dữ liệu từ ItemOrders

Nhìn vào bảng ItemOrders, ta có thể trả lời, Order có OrderId =1 có hai sản phẩm là Item có Id =1 và 2.

Item có ItemId = 1 thuộc hai Order có OrderId = 1 và 2

Lưu ý:

Khi tạo các hai có mối quan hệ nhiều nhiều, bạn phải tạo thêm một bảng phụ để lưu giữ khóa ngoại của hai bảng đó.

 

Các môn học khác

Khóa học này cung cấp cho ta kiến thức nền tảng về công nghệ Blockchain, Bitcoin. Vì sao nó được gọi là công nghệ của tương lai, vì sao giá Bitcoin lại cao đến vậy. Làm sao để mua Bitcoin, ETH.

Docker là công nghệ ảo hóa container phổ biến nhất hiện nay. Nó giúp bạn phát triển và deploy phần mềm một cách dễ dàng hơn.

Chương trình thường được xây dựng quanh dữ liệu và logic để xử lý chúng. Nói cách khác: Program = Cấu trúc dữ liệu + giải thuật. Do vậy đây là môn học bắt buộc dành cho các lập trình viên.