Khóa chính trong cơ sở dữ liệu là gì? Các ràng buộc về khóa chính và khóa ngoại của bảng Khóa

Khóa ngoại là khóa dùng để nối hai bảng. Nó đôi khi còn được gọi là khóa tham chiếu.

Khóa ngoại là một cột hoặc tổ hợp các cột có giá trị tương ứng với khóa chính trong bảng khác.

Mối quan hệ giữa 2 bảng tương ứng với khóa chính ở một trong các bảng có khóa ngoại ở bảng thứ hai.

Nếu một bảng có khóa chính được xác định trên bất kỳ trường nào thì bạn không thể có hai bản ghi có cùng giá trị cho (các) trường đó.

Ví dụ

Chúng ta hãy xem cấu trúc của hai bảng sau.

bảng KHÁCH HÀNG

TẠO BẢNG KHÁCH HÀNG(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ĐỊA CHỈ CHAR (25), LƯƠNG THẬP KÝ (18, 2), PRIMARY KEY (ID));

bảng ĐƠN HÀNG

TẠO BẢNG ĐƠN ĐẶT HÀNG (ID INT KHÔNG NULL, DATE DATETIME, KHÁCH HÀNG_ID INT tham chiếu KHÁCH HÀNG(ID), SỐ TIỀN gấp đôi, KHÓA CHÍNH (ID));

Nếu bảng ORDERS đã được tạo và khóa ngoại chưa được đặt thì cú pháp được sử dụng để đặt khóa ngoại bằng cách sửa đổi bảng.

THAY ĐỔI BẢNG ĐẶT HÀNG THÊM KHÓA NGOÀI (Customer_ID) THAM KHẢO KHÁCH HÀNG (ID);

Loại bỏ ràng buộc khóa ngoại

Để loại bỏ ràng buộc khóa ngoại, hãy sử dụng cú pháp SQL sau.

THAY ĐỔI ĐẶT HÀNG BẢNG BỎ KHÓA NGOẠI;

Đây là những kho thông tin điện tử được truy cập bằng một hoặc nhiều máy tính. Thông thường, cơ sở dữ liệu được tạo ra để lưu trữ và truy cập dữ liệu chứa thông tin về một lĩnh vực chủ đề nhất định, tức là một số lĩnh vực hoạt động của con người hoặc một phần của thế giới thực.

DBMS là các công cụ phần mềm để tạo, điền, cập nhật và xóa cơ sở dữ liệu.

Đơn vị thông tin được lưu trữ trong cơ sở dữ liệu là bảng. Mỗi bảng là một tập hợp các hàng và cột, trong đó các hàng tương ứng với một thể hiện của một đối tượng, một sự kiện hoặc hiện tượng cụ thể và các cột tương ứng với các thuộc tính (đặc điểm, đặc điểm, thông số) của đối tượng, sự kiện hoặc hiện tượng. Mỗi dòng chứa thông tin về một sự kiện cụ thể.

Trong thuật ngữ cơ sở dữ liệu, các cột của bảng được gọi là trường và các hàng của bảng được gọi là bản ghi.

Mối quan hệ có thể tồn tại giữa các bảng cơ sở dữ liệu riêng lẻ, nghĩa là thông tin trong bảng trước có thể được thêm vào bảng khác. Cơ sở dữ liệu có mối quan hệ giữa các bảng riêng lẻ được gọi là quan hệ. Cùng một bảng có thể là bảng chính liên quan đến một bảng cơ sở dữ liệu và bảng con liên quan đến bảng khác.

Các bảng được kết nối bằng các mối quan hệ tương tác theo nguyên tắc chủ-phụ. Bảng giống nhau có thể là bảng chính của một bảng cơ sở dữ liệu và là bảng con của một bảng cơ sở dữ liệu khác.

Một đối tượng – là một cái gì đó tồn tại và có thể phân biệt được, sở hữu một tập hợp các thuộc tính. Sự khác biệt giữa đối tượng này và đối tượng khác được xác định bởi các giá trị thuộc tính cụ thể.

Nước hoa – sự phản ánh của một đối tượng trong bộ nhớ của một người hoặc máy tính.

Thuộc tính – giá trị cụ thể của bất kỳ thuộc tính nào của thực thể.

Cánh đồng là một phần tử duy nhất của bản ghi lưu trữ một giá trị thuộc tính cụ thể.

Lĩnh vực truyền thông Đây là trường mà hai bảng có liên quan.

Khóa chính và khóa phụ

Mỗi bảng cơ sở dữ liệu có thể có một khóa chính - đây là một trường hoặc một tập hợp các trường xác định duy nhất một bản ghi.

Giá trị khóa chính trong bảng cơ sở dữ liệu phải là duy nhất, nghĩa là không được có hai hoặc nhiều bản ghi trong bảng có cùng giá trị khóa chính.

Khóa chính giúp thiết lập mối quan hệ giữa các bảng dễ dàng hơn. Vì khóa chính phải là duy nhất nên không phải tất cả các trường trong bảng đều có thể sử dụng được.

Nếu bảng không có các trường có giá trị duy nhất, thì để tạo khóa chính, một trường số bổ sung thường được đưa vào đó, các giá trị mà DBMS có thể tùy ý loại bỏ.

Khóa phụ được thiết lập theo các trường thường được sử dụng khi tìm kiếm hoặc sắp xếp dữ liệu: các chỉ mục được xây dựng trên khóa phụ sẽ giúp hệ thống tìm thấy các giá trị cần thiết được lưu trữ trong các trường tương ứng nhanh hơn rất nhiều.

Không giống như khóa chính, các trường dành cho khóa phụ có thể chứa thông tin không phải là duy nhất.

Mối quan hệ giữa các bảng

Một đối một. Mối quan hệ một-một xảy ra khi một bản ghi trong bảng cha khớp với một bản ghi trong bảng con.

Mối quan hệ này ít phổ biến hơn nhiều so với mối quan hệ một-nhiều; nó được sử dụng nếu bạn không muốn bảng cơ sở dữ liệu bị phồng lên bởi một bảng phụ. Mối quan hệ một-một có nghĩa là việc đọc thông tin liên quan trong nhiều bảng yêu cầu nhiều thao tác đọc, điều này làm chậm quá trình truy xuất thông tin được yêu cầu. Ngoài ra, cơ sở dữ liệu chứa các bảng có mối quan hệ một-một không thể được coi là chuẩn hóa hoàn toàn.

Giống như mối quan hệ một-nhiều, mối quan hệ một-một có thể cứng rắn hoặc mềm mỏng.

Khóa là thành phần cơ bản của cơ sở dữ liệu quan hệ vì chúng thiết lập mối quan hệ giữa một cặp bảng và cung cấp mã nhận dạng duy nhất cho mỗi bản ghi trong bảng. Chìa khóa quan trọng hơn việc thiết lập các mối quan hệ; chúng cũng hỗ trợ tính toàn vẹn tham chiếu và chúng là thành phần chính của tính toàn vẹn ở cấp độ bảng. Các bảng lưu trữ khối dữ liệu khổng lồ thường bao gồm hàng nghìn bản ghi, tất cả đều chưa được sắp xếp và vô tổ chức. Đôi khi, việc truy xuất dữ liệu cụ thể từ nhiều bản ghi này có thể khó khăn hoặc không thể thực hiện được. Đây là nơi Chìa khóa xuất hiện. Ở đây chúng ta sẽ xem xét hai khóa lược đồ cơ sở dữ liệu quan hệ rất quan trọng và sự khác biệt giữa chúng: Khóa chính và Khóa ngoại.

Khóa chính là gì?

Khóa chính là khóa đặc biệt dùng để xác định duy nhất từng bản ghi trong bảng. Trong cơ sở dữ liệu quan hệ, điều rất quan trọng là phải có một mã định danh duy nhất trong mỗi hàng của bảng và khóa chính đơn giản là thứ bạn cần để xác định duy nhất một bộ dữ liệu trong bảng. Tuple là tập hợp các thuộc tính giá trị trong cơ sở dữ liệu quan hệ. Khóa chính có thể tham chiếu đến một cột hoặc tập hợp các cột trong bảng cơ sở dữ liệu quan hệ được sử dụng để xác định ngầm tất cả các bản ghi trong bảng. Khóa chính phải là duy nhất cho mỗi bản ghi vì nó hoạt động như một mã định danh duy nhất và không được chứa các giá trị Null. Mỗi cơ sở dữ liệu phải có một và chỉ một khóa chính.

Khóa ngoại là gì?

Khóa ngoại đề cập đến một trường hoặc tập hợp các trường trong bản ghi cơ sở dữ liệu xác định duy nhất trường khóa của bản ghi cơ sở dữ liệu khác trong một bảng khác. Nói một cách đơn giản, nó thiết lập mối quan hệ giữa các bản ghi trong hai bảng khác nhau trong cơ sở dữ liệu. Nó có thể là một cột trong bảng trỏ đến các cột khóa chính, có nghĩa là khóa ngoại được xác định trong bảng tham chiếu đến khóa chính của một số bảng khác. Các liên kết rất quan trọng trong cơ sở dữ liệu quan hệ để thiết lập mối quan hệ giữa các bản ghi, cần thiết để sắp xếp cơ sở dữ liệu. Khóa ngoại đóng vai trò quan trọng trong việc chuẩn hóa cơ sở dữ liệu quan hệ, đặc biệt khi các bảng cần truy cập vào các bảng khác.

Sự khác biệt giữa khóa chính và khóa ngoại

Khái niệm cơ bản về khóa chính và khóa ngoại

Khóa chính là khóa đặc biệt trong cơ sở dữ liệu quan hệ, hoạt động như một mã định danh duy nhất cho mỗi bản ghi, nghĩa là nó xác định duy nhất từng hàng/bản ghi trong bảng và giá trị của nó phải là duy nhất cho mỗi hàng của bảng. Mặt khác, khóa ngoại là một trường trong một bảng liên kết hai bảng với nhau. Nó đề cập đến một cột hoặc nhóm cột xác định duy nhất một hàng của một bảng khác hoặc cùng một bảng.

Mối quan hệ khóa chính và khóa ngoại

Khóa chính xác định duy nhất một bản ghi trong bảng cơ sở dữ liệu quan hệ, trong khi khóa ngoại đề cập đến một trường trong bảng là khóa chính của bảng khác. Khóa chính phải là duy nhất và chỉ được phép xác định một khóa chính trong một bảng, trong khi đó được phép có nhiều khóa ngoại trong một bảng.

Sao chép giá trị khóa chính và khóa ngoại

Khóa chính là sự kết hợp của các ràng buộc UNIQUE và Not Null, do đó, trường khóa chính trong bảng cơ sở dữ liệu quan hệ không được phép có các giá trị trùng lặp. Không có hai hàng nào có thể mang các giá trị trùng lặp cho một thuộc tính khóa chính. Không giống như khóa chính, khóa ngoại có thể chứa các giá trị trùng lặp và một bảng trong cơ sở dữ liệu quan hệ có thể chứa nhiều khóa ngoại.

Khóa chính và khóa ngoại NULL

Một trong những khác biệt chính giữa hai loại này là, không giống như khóa chính, khóa ngoại cũng có thể chứa giá trị NULL. Một bảng trong cơ sở dữ liệu quan hệ chỉ có thể có một khóa chính, khóa này không thể rỗng.

Bảng tạm thời của khóa chính và khóa ngoại

Ràng buộc khóa chính có thể được xác định ngầm trên các bảng tạm thời và các biến của chúng, trong khi ràng buộc khóa ngoại không thể được áp dụng cho các bảng tạm thời cục bộ hoặc toàn cục.

Xóa khóa chính và khóa ngoại

Không thể xóa giá trị khóa chính khỏi bảng cha, được gọi là khóa ngoại trong bảng con. Trước khi loại bỏ bảng cha, trước tiên bạn phải loại bỏ bảng con. Ngược lại, một giá trị khóa ngoại có thể bị xóa khỏi bảng con ngay cả khi giá trị đó thuộc về khóa chính của bảng cha.

Khóa chính hoặc khóa ngoại: bảng so sánh

Tóm tắt các phím chính

Các khóa đóng một vai trò quan trọng trong sự tồn tại của lược đồ cơ sở dữ liệu để thiết lập mối quan hệ giữa các bảng và trong một bảng. Khóa thiết lập các mối quan hệ và thực thi các loại tính toàn vẹn khác nhau, đặc biệt là tính toàn vẹn ở cấp độ bảng và cấp độ mối quan hệ. Đầu tiên, họ tin rằng một bảng chứa các bản ghi duy nhất và các trường bạn sử dụng để thiết lập mối quan hệ giữa các bảng phải chứa các giá trị tương ứng. Khóa chính và khóa ngoại là hai loại khóa quan trọng và phổ biến nhất được sử dụng trong cơ sở dữ liệu quan hệ. Khóa chính là khóa đặc biệt dùng để xác định duy nhất các bản ghi trong bảng, trong khi khóa ngoại được sử dụng để thiết lập mối quan hệ giữa hai bảng. Cả hai đều có cấu trúc giống hệt nhau nhưng đóng vai trò khác nhau trong lược đồ cơ sở dữ liệu quan hệ.

Và vì vậy, lặng lẽ, chúng tôi tiếp cận một chủ đề rất quan trọng - khóa chính và khóa ngoại. Nếu cái trước được hầu hết mọi người sử dụng, thì cái sau bằng cách nào đó sẽ bị bỏ qua. Nhưng vô ích. Khóa ngoại không phải là vấn đề, chúng thực sự trợ giúp về tính toàn vẹn dữ liệu.

1.2.5. Khóa chính

Chúng ta đã nói rất nhiều về các lĩnh vực chính nhưng chưa bao giờ sử dụng chúng. Điều thú vị nhất là mọi thứ đều hiệu quả. Đây là một ưu điểm hoặc có thể là nhược điểm của cơ sở dữ liệu Microsoft SQL Server và MS Access. Thủ thuật này sẽ không hoạt động trong các bảng Paradox và nếu không có trường khóa thì bảng sẽ ở chế độ chỉ đọc.

Ở một mức độ nào đó, khóa là các ràng buộc và chúng có thể được xem xét cùng với câu lệnh CHECK vì việc khai báo diễn ra theo cách tương tự và thậm chí còn sử dụng câu lệnh CONSTRAINT. Hãy xem quá trình này bằng một ví dụ. Để làm điều này, chúng ta sẽ tạo một bảng gồm hai trường “guid” và “vcName”. Điều này đặt trường "hướng dẫn" làm khóa chính:

TẠO BẢNG Globally_Unique_Data (mã định danh duy nhất hướng dẫn DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (Guid))

Phần hay nhất ở đây là dòng CONSTRAINT. Như chúng ta đã biết, sau từ khóa này là tên của ràng buộc và phần khai báo khóa cũng không ngoại lệ. Để đặt tên cho khóa chính, tôi khuyên bạn nên sử dụng tên như PK_name, trong đó tên là tên của trường sẽ trở thành khóa chính. PK viết tắt xuất phát từ Khóa chính.

Sau đó, thay vì từ khóa CHECK mà chúng ta đã sử dụng trong các ràng buộc, có một toán tử PRIMARY KEY, đây là dấu hiệu cho biết rằng chúng ta không cần séc mà cần một khóa chính. Một hoặc nhiều trường sẽ tạo nên khóa được chỉ định trong dấu ngoặc đơn.

Hãy nhớ rằng không có hai hàng nào có thể có cùng giá trị trong một trường khóa, trong đó ràng buộc khóa chính giống hệt với ràng buộc duy nhất. Điều này có nghĩa là nếu bạn đặt trường lưu trữ họ làm khóa chính, thì sẽ không thể viết hai Ivanov có tên khác nhau trong một bảng như vậy. Điều này vi phạm ràng buộc khóa chính. Đây là lý do tại sao khóa là ràng buộc và được khai báo giống như ràng buộc CHECK. Nhưng điều này không chỉ đúng với khóa chính và khóa phụ có tính duy nhất.

Trong ví dụ này, khóa chính là trường thuộc loại mã định danh duy nhất (GUID). Giá trị mặc định cho trường này là kết quả của quy trình máy chủ NEWID.

Chú ý

Chỉ có thể tạo một khóa chính cho một bảng

Để đơn giản hóa ví dụ, nên sử dụng kiểu số làm khóa, nếu cơ sở dữ liệu cho phép thì nên dùng kiểu “autoincrement” (tự động tăng/giảm số). Trong MS SQL Server, trường này là IDENTITY và trong MS Access, trường này là trường loại "bộ đếm".

Ví dụ sau đây cho thấy cách tạo bảng sản phẩm với trường số nguyên tăng tự động làm khóa chính:

TẠO BẢNG Sản phẩm (id int IDENTITY(1, 1), sản phẩm varchar(50), Giá tiền, Số lượng (10, 2), CONSTRAINT PK_id PRIMARY KEY (id))

Đây là loại khóa chúng ta sẽ sử dụng thường xuyên nhất vì trường khóa sẽ lưu trữ các số dễ hiểu và dễ làm việc hơn và trực quan hơn.

Khóa chính có thể bao gồm nhiều hơn một cột. Ví dụ sau tạo một bảng trong đó các trường "id" và "Product" tạo thành khóa chính, nghĩa là một chỉ mục duy nhất sẽ được tạo trên cả hai trường:

TẠO BẢNG Sản phẩm1 (id int IDENTITY(1, 1), Product varchar(50), Giá tiền, Số lượng (10, 2), CONSTRAINT PK_id PRIMARY KEY (id, [Tên sản phẩm]))

Rất thường xuyên, các lập trình viên tạo cơ sở dữ liệu với trường khóa ở dạng số nguyên, nhưng đồng thời, nhiệm vụ nêu rõ rằng một số trường nhất định phải là duy nhất. Tại sao không tạo ngay khóa chính từ các trường phải là duy nhất và sẽ không cần tạo giải pháp riêng cho vấn đề này.

Hạn chế duy nhất của khóa chính nhiều cột là vấn đề tạo mối quan hệ. Ở đây bạn phải thoát khỏi nó bằng nhiều phương pháp khác nhau, nhưng vấn đề vẫn có thể được giải quyết. Bạn chỉ cần nhập một trường thuộc loại mã định danh duy nhất và tạo kết nối bằng cách sử dụng nó. Có, trong trường hợp này, chúng tôi nhận được một khóa chính duy nhất và một trường thuộc loại mã định danh duy nhất, nhưng kết quả là độ dư thừa này sẽ không lớn hơn cùng một bảng trong đó khóa chính là mã định danh duy nhất và ràng buộc về tính duy nhất được đặt trên các trường phải trở nên độc đáo. Chọn cái gì? Phụ thuộc vào nhiệm vụ cụ thể và những gì bạn cảm thấy thoải mái hơn khi làm việc.

1.2.6. Chìa khóa ngoài

Khóa ngoại cũng là một ràng buộc CONSTRAINT và thể hiện mối quan hệ giữa hai bảng. Giả sử bạn có hai bảng:

  • Tên – chứa tên của mọi người và bao gồm các trường định danh (trường khóa), tên.
  • Điện thoại là một bảng điện thoại bao gồm một mã định danh (trường khóa), khóa ngoại để kết nối với bảng tên và trường chuỗi để lưu trữ số điện thoại.

Một người có thể có nhiều điện thoại nên chúng tôi chia việc lưu trữ dữ liệu thành các bảng khác nhau. Hình 1.4 thể hiện trực quan mối quan hệ giữa hai bảng. Nếu bạn đã làm việc với các bảng được liên kết thì điều này là đủ đối với bạn. Nếu bạn lần đầu tiên nghe về các kết nối, thì hãy thử xem xét vấn đề kỹ hơn.

Ví dụ: hãy lấy một bàn có ba người. Bảng 1.3 thể hiện nội dung của bảng "Names". Chỉ có ba dòng và mỗi dòng có khóa chính duy nhất. Để độc đáo, khi tạo bảng, chúng tôi sẽ đặt khóa thành trường tăng tự động.

Bảng 1.3 Nội dung của bảng Tên

Bảng 1.4. Nội dung của bảng Điện thoại

Bảng 1.4 chứa năm số điện thoại. Trường khóa chính cũng chứa một khóa chính duy nhất, khóa này cũng có thể được tăng tự động. Khóa phụ là mối quan hệ với khóa chính của bảng Tên. Kết nối này hoạt động như thế nào? Petrov lấy số 1 làm khóa chính trong bảng Names, trong bảng Phones, ở khóa phụ, chúng ta tìm số 1 và lấy số điện thoại của Petrov. Tương tự với các mục còn lại. Kết nối trực quan có thể được nhìn thấy trong Hình 1.5.

Kiểu lưu trữ dữ liệu này rất thuận tiện. Nếu không thể tạo các bảng liên quan thì trong bảng Tên chúng ta sẽ phải nhập tất cả các số điện thoại vào một trường. Điều này bất tiện từ quan điểm sử dụng, bảo trì và truy xuất dữ liệu.

Bạn có thể tạo một số trường Tên trong một bảng, nhưng câu hỏi đặt ra là - bao nhiêu trường. Một người chỉ được có 1 chiếc điện thoại, nhưng tôi chẳng hạn có 3 chiếc, không tính điện thoại công việc. Một số lượng lớn các trường dẫn đến dư thừa dữ liệu.

Bạn có thể tạo một hàng riêng với họ cho mỗi điện thoại trong bảng Tên, nhưng điều này chỉ dễ dàng với một ví dụ đơn giản như vậy, khi bạn chỉ cần nhập họ và bạn có thể dễ dàng tạo một số mục cho Petrov bằng nhiều điện thoại. những con số. Nếu có 10 hoặc 20 trường thì sao? Vì vậy, có thể thấy việc tạo hai bảng được liên kết bằng khóa ngoại trong Liệt kê 1.6.

Liệt kê 1.6. Tạo bảng liên kết bằng khóa ngoại

TẠO Tên BẢNG (idName int IDENTITY(1,1), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName),) TẠO BẢNG Điện thoại (idPhone int IDENTITY(1,1), idName int, vcPhone varchar(10), CONSTRAINT PK_idPhone KHÓA CHÍNH (idPhone), CONSTRAINT FK_idName KHÓA NGOÀI (idName) TÀI LIỆU THAM KHẢO Tên (idName))

Vui lòng xem lại nội dung danh sách một cách cẩn thận. Điều này khá thú vị vì nó sử dụng một số toán tử mà chúng ta đã đề cập và một ví dụ bổ sung sẽ hữu ích. Đối với cả hai bảng, một trường khóa sẽ được tạo, trường này xuất hiện trước, thuộc loại int và được tăng tự động, bắt đầu từ 1 với gia số một. Trường khóa được đặt làm khóa chính bằng cách sử dụng ràng buộc CONSTRAINT.

Trong phần mô tả của bảng Điện thoại, dòng cuối cùng chứa một khai báo mới cho chúng ta, cụ thể là khai báo khóa ngoại bằng toán tử FOREIGN KEY. Như bạn có thể thấy, đây cũng là một hạn chế và một lát sau bạn sẽ hiểu tại sao. Trường bảng cần được liên kết với bảng khác được chỉ định trong dấu ngoặc đơn. Sau đó là từ khóa THAM KHẢO (liên kết), tên của bảng mà kết nối sẽ là (Tên) và trong ngoặc đơn là tên của trường ("idName"). Như vậy, chúng ta đã tạo được một kết nối, được thể hiện trong Hình 1.4.

Chú ý!

Khóa ngoại chỉ có thể tham chiếu khóa chính của bảng khác hoặc một ràng buộc duy nhất. Điều này có nghĩa là sau từ khóa REFERENCES phải có tên bảng và chỉ có khóa chính hoặc trường có ràng buộc UNIQUE mới có thể được chỉ định trong dấu ngoặc đơn. Các trường khác không thể được chỉ định.

Bây giờ, nếu bạn có thể điền dữ liệu vào các bảng. Ba đội tiếp theo thêm ba cái tên chúng ta đã thấy ở Bảng 1.3:

CHÈN VÀO Tên(vcName) GIÁ TRỊ("Petrov") CHÈN VÀO Tên(vcName) GIÁ TRỊ("Ivanov") CHÈN VÀO Tên(vcName) GIÁ TRỊ("Sidorov")

Nếu bạn đã làm việc với SQL, bạn có thể thêm các mục cho bảng điện thoại. Tôi sẽ bỏ qua những lệnh này, nhưng bạn có thể thấy chúng trong tệp external_keys.sql trong thư mục Chương 1 trên đĩa CD.

Nhiệm vụ của chúng ta bây giờ là xem những hành động hạn chế của khóa ngoại là gì, chúng ta cùng tìm hiểu nhé. Chúng tôi đã chỉ định mối quan hệ rõ ràng giữa hai trường trong các bảng khác nhau. Nếu bạn cố gắng thêm một bản ghi vào bảng điện thoại có mã định danh trong trường "idName" không tồn tại trong trường cùng tên (tên có thể được đổi thành tên khác) trong bảng có họ, sẽ xảy ra lỗi . Điều này sẽ phá vỡ mối quan hệ giữa hai bảng và ràng buộc khóa ngoại sẽ không cho phép các bản ghi tồn tại mà không có mối quan hệ.

Hạn chế cũng được áp dụng khi thay đổi hoặc xóa bản ghi. Ví dụ: nếu bạn cố xóa một hàng có họ Petrov, lỗi ràng buộc khóa ngoại sẽ xảy ra. Bạn không thể xóa bản ghi có hàng liên quan bên ngoài. Đầu tiên, bạn cần xóa tất cả số điện thoại của mục này và chỉ sau đó mới có thể xóa dòng có họ Petrov.

Khi tạo khóa ngoại, bạn có thể chỉ định BẬT XÓA CASCADE hoặc BẬT CẬP NHẬT CASCADE. Trong trường hợp này, nếu bạn xóa bản ghi của Petrov khỏi bảng Tên hoặc thay đổi mã nhận dạng thì tất cả các bản ghi trong bảng Điện thoại được liên kết với hàng của Petrov sẽ được cập nhật tự động. Không bao giờ. Không, nó cần phải được viết bằng chữ in hoa: KHÔNG BAO GIỜ làm điều này. Mọi thứ phải được xóa hoặc thay đổi bằng tay. Nếu người dùng vô tình xóa một mục khỏi bảng Tên thì các điện thoại tương ứng cũng bị xóa. Sẽ chẳng có ích gì khi tạo khóa ngoại nếu một nửa hạn chế của nó biến mất! Mọi thứ phải được thực hiện thủ công và không bao giờ nên thay đổi số nhận dạng.

Việc xóa các bảng cũng phải bắt đầu bằng bảng phụ, tức là Điện thoại, và chỉ sau đó bạn mới có thể xóa bảng Tên chính.

Cuối cùng, tôi sẽ chỉ cho bạn cách so khớp đẹp mắt giữa tên và số điện thoại từ hai bảng:

CHỌN vcName, vcPhone TỪ Tên, Điện thoại Ở ĐÂU Names.idName=Phones.idName

Chúng ta sẽ nói về những truy vấn như vậy chi tiết hơn trong Chương 2. Bây giờ, tôi chỉ đưa ra một ví dụ để bạn có thể thấy sức mạnh của các bảng liên quan.

Một bảng có thể chứa tới 253 khóa ngoại, khá đủ cho cả những cơ sở dữ liệu phức tạp nhất. Cá nhân tôi đã phải làm việc với các cơ sở dữ liệu có số lượng khóa ngoại không vượt quá 7 trên mỗi bảng. Nếu nhiều hơn thì rất có thể cơ sở dữ liệu được thiết kế sai, mặc dù vẫn có những trường hợp ngoại lệ.

Bản thân bảng cũng có thể có tối đa 253 khóa ngoại. Khóa ngoại trong một bảng ít phổ biến hơn, thường không quá 3. Thông thường, một bảng có thể có nhiều liên kết đến các bảng khác.

Khóa ngoại có thể tham chiếu đến cùng bảng mà nó được tạo. Ví dụ: bạn có một bảng chức danh công việc trong một tổ chức, như trong Bảng 1.5. Bảng bao gồm ba trường: khóa chính, khóa ngoại và chức danh công việc. Bất kỳ tổ chức nào cũng có thể có nhiều vị trí, nhưng sẽ khá logic nếu hiển thị tên và cơ cấu cấp dưới của họ trong một bảng. Để làm được điều này, khóa ngoại phải được liên kết với khóa chính của bảng vị trí.

Bảng 1.5. Bảng có liên kết nội bộ

Kết quả là, chúng ta nhận được rằng tổng giám đốc có khóa ngoại bằng 0, tức là. vị trí này đứng đầu tất cả những người khác. Đối với giám đốc thương mại và giám đốc tổng hợp, khóa ngoại chỉ vào hàng tổng giám đốc. Điều này có nghĩa là hai vị trí này báo cáo trực tiếp cho CEO. Và như thế.

Hãy xem cách chúng ta có thể tạo tất cả những thứ này dưới dạng truy vấn SQL:

TẠO các vị trí BẢNG (idPosition int IDENTITY(1,1), idParentPosition int, vcName varchar(30), CONSTRAINT PK_idPosition PRIMARY KEY (idPosition), CONSTRAINT FK_idParentPosition FOREIGN KEY (idParentPosition) TÀI LIỆU THAM KHẢO Vị trí (idPosition))

Như bạn có thể thấy, khóa ngoại chỉ đơn giản tham chiếu đến cùng bảng mà chúng ta đang tạo. Trên đĩa CD, trong thư mục Chapter1, bạn có thể thấy trong tệp external_keys_to_self.sql một ví dụ về cách tạo bảng này, điền dữ liệu vào bảng và hiển thị các vị trí có tính đến sự phụ thuộc của chúng. Trong chương tiếp theo, chúng ta sẽ xem xét khả năng làm việc với các bảng như vậy một cách chi tiết hơn.

Mối quan hệ một đối một

Cho đến nay, chúng ta đã xem xét mối quan hệ cổ điển, khi một hàng của bảng dữ liệu chính tương ứng với một hàng của bảng liên quan. Mối quan hệ này được gọi là một-nhiều. Nhưng có những kết nối khác, và bây giờ chúng ta sẽ xem xét một kết nối khác - từng cái một, khi một bản ghi trong bảng chính được kết nối với bản ghi này của một bản ghi khác. Để thực hiện điều này, chỉ cần liên kết các khóa chính của cả hai bảng là đủ. Vì khóa chính không thể lặp lại nên chỉ có một hàng có thể liên quan trong cả hai bảng.

Ví dụ sau tạo hai bảng có mối quan hệ khóa chính:

TẠO Tên BẢNG (idName mã định danh duy nhất DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName)) TẠO BẢNG Điện thoại (idPhone mã định danh duy nhất DEFAULT NEWID(), vcPhone varchar(10), CONSTRAINT PK_idPhone PRIMARY KEY (idPhone), CONSTRAINT FK_idPhone KHÓA NGOÀI (idPhone) TÀI LIỆU THAM KHẢO Tên (idName))

Chỉ một trong các bảng cần khóa ngoại. Vì mối quan hệ là một-một nên việc tạo nó ở bảng nào không quan trọng.

nhiều nhiều

Mối quan hệ phức tạp nhất là nhiều-nhiều, trong đó nhiều bản ghi từ một bảng khớp với nhiều bản ghi từ một bảng khác. Để thực hiện điều này, hai bảng là không đủ; cần có ba bảng.

Đầu tiên chúng ta cần hiểu khi nào có thể sử dụng mối quan hệ nhiều-nhiều? Giả sử bạn có hai bảng: danh sách cư dân trong nhà và danh sách số điện thoại. Một căn hộ có thể có nhiều số điện thoại, nghĩa là một họ có thể có hai số điện thoại. Hóa ra có mối quan hệ một-nhiều. Mặt khác, có thể có hai gia đình trong một căn hộ (căn hộ chung hoặc chỉ một người thuê nhà sử dụng điện thoại của chủ sở hữu), điều đó có nghĩa là kết nối giữa điện thoại và cư dân cũng là một đến nhiều. Và phương án khó khăn nhất là có hai chiếc điện thoại trong một căn hộ chung. Trong trường hợp này, cả hai số đều được một số cư dân trong căn hộ sử dụng. Vậy hóa ra “nhiều” gia đình có thể sử dụng điện thoại “nhiều” (giao tiếp nhiều-nhiều).

Làm cách nào để triển khai mối quan hệ nhiều-nhiều? Thoạt nhìn, điều này là không thể trong mô hình quan hệ. Khoảng 10 năm trước, tôi đã dành một thời gian dài để tìm kiếm các lựa chọn khác nhau và kết quả là tôi chỉ tạo được một bảng chứa đầy dữ liệu dư thừa. Nhưng một ngày nọ, tôi được giao một nhiệm vụ, nhờ đó, một giải pháp tuyệt vời đã xuất hiện từ các điều kiện - tôi cần tạo hai bảng gồm cư dân chung cư và số điện thoại và chỉ triển khai một khóa chính trong đó. Khóa ngoại không cần thiết trong bảng này. Nhưng kết nối giữa các bảng phải thông qua bảng kết nối thứ ba. Thoạt nhìn, điều này khó và không rõ ràng, nhưng một khi bạn hiểu phương pháp này, bạn sẽ thấy toàn bộ sức mạnh của giải pháp này.

Bảng 1.6 và 1.7 lần lượt đưa ra ví dụ về bảng họ và số điện thoại. Và Bảng 1.8 hiển thị bảng liên kết.

Bảng 1.6. Bảng họ

Bảng 1.7. Bàn điện thoại

Bảng 1.8. Bàn điện thoại

Bây giờ chúng ta hãy xem logic tìm kiếm dữ liệu sẽ như thế nào trong mối quan hệ nhiều-nhiều. Giả sử chúng ta cần tìm tất cả điện thoại của Ivanov. Khóa chính của Ivanov bằng 1. Chúng tôi tìm thấy trong bảng liên kết tất cả các bản ghi mà trường “Mối quan hệ với tên” bằng 1. Đây sẽ là bản ghi 1 và 2. Trong các bản ghi này trong trường “Mối quan hệ với điện thoại” có lần lượt là số nhận dạng 1 và 2 và Điều này có nghĩa là Ivanov sở hữu các số từ bảng điện thoại nằm ở dòng 1 và 2.

Bây giờ chúng ta hãy giải bài toán ngược - xác định ai có quyền truy cập vào số điện thoại 567575677. Số này trong bảng điện thoại có khóa 3. Chúng tôi đang tìm kiếm tất cả các bản ghi trong bảng liên kết, trong đó trong trường “Kết nối điện thoại” nó bằng 3. Đây là các bản ghi có số 4 và 5, trong trường "Liên kết tên" lần lượt chứa các giá trị 2 và 3. Nếu bây giờ bạn nhìn vào bảng họ, bạn sẽ thấy Petrov và Sidorov ở số 2 và 3. Điều này có nghĩa là hai cư dân này sử dụng số điện thoại 567575677.

Xem lại cả ba bảng và đảm bảo bạn hiểu số điện thoại nào thuộc về cư dân nào và ngược lại. Nếu bạn nhìn thấy sự kết nối này, bạn sẽ hiểu rằng nó đơn giản như ba xu và bạn có thể nhanh chóng triển khai nó trong các dự án của mình.

TẠO Tên BẢNG (idName mã định danh duy nhất DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName)) TẠO BẢNG Điện thoại (idPhone mã định danh duy nhất DEFAULT NEWID(), vcPhone varchar(10), CONSTRAINT PK_idPhone PRIMARY KEY (idPhone)) TẠO BẢNG LinkTable (mã định danh duy nhất idLinkTable DEFAULT NEWID(), mã định danh duy nhất idName, mã định danh duy nhất idPhone, CONSTRAINT PK_idLinkTable KHÓA CHÍNH (idLinkTable), CONSTRAINT FK_idPhone KHÓA NGOÀI (idPhone) TÀI LIỆU THAM KHẢO Điện thoại (idPhone), CONSTRAINT FK_idName KHÓA NGOÀI (idName) THAM KHẢO Tên (idName) ) )

Bảng liên kết có hai khóa ngoại liên kết đến tên và bảng điện thoại, đồng thời một khóa chính đảm bảo rằng các bản ghi là duy nhất.

Tôi đã chọn trường GUID làm khóa chính vì nó thuận tiện hơn cho việc giải quyết vấn đề cụ thể này. Thực tế là chúng ta cần chèn các bản ghi vào hai bảng và trong cả hai trường hợp, chúng ta cần chỉ định cùng một khóa. Giá trị GUID có thể được tạo và sau đó được sử dụng khi chèn dữ liệu vào cả hai bảng.

Bạn cũng có thể sử dụng trường tăng tự động làm khóa, nhưng trong trường hợp này, vấn đề khó giải quyết hơn một chút, hay đúng hơn là việc giải quyết vấn đề sẽ bất tiện. Ví dụ: khi thêm số điện thoại, trước tiên bạn phải chèn hàng tương ứng vào bảng, sau đó tìm nó, xác định khóa được gán cho hàng rồi thực hiện kết nối.

Ở giai đoạn này, chúng ta chỉ giới hạn ở việc tạo bảng, nhưng trong phần 2.8, chúng ta sẽ quay lại chủ đề này và tìm hiểu cách làm việc với các bảng liên quan. Làm việc với mối quan hệ một-một và một-nhiều không khác nhau lắm vì chỉ có hai bảng tham gia vào sơ đồ này. Mối quan hệ nhiều-nhiều phức tạp hơn một chút do bảng liên kết, vì vậy chúng tôi sẽ trình bày riêng vấn đề đó trong Phần 2.27.

Cập nhật lần cuối: 02/07/2017

Cơ sở dữ liệu có thể chứa các bảng được kết nối với nhau bằng nhiều liên kết khác nhau. Một mối quan hệ thể hiện sự liên kết giữa các thực thể thuộc các loại khác nhau.

Khi chọn mối quan hệ, bảng chính hoặc bảng cha (bảng khóa chính/bảng chính) và bảng con phụ thuộc (bảng khóa ngoại/bảng con) sẽ được chọn. Bảng con phụ thuộc vào bảng cha.

Khóa ngoại được sử dụng để tổ chức giao tiếp. Khóa ngoại đại diện cho một hoặc nhiều cột từ một bảng cũng là khóa tiềm năng từ một bảng khác. Khóa ngoại không nhất thiết phải khớp với khóa chính của bảng chính. Mặc dù, theo quy định, khóa ngoại từ bảng phụ thuộc sẽ trỏ đến khóa chính từ bảng chính.

Mối quan hệ giữa các bảng có các loại sau:

    Một đối một

    Một đến nhiều

    nhiều nhiều(Nhiều nhiều)

Giao tiếp một-một

Loại kết nối này không được tìm thấy thường xuyên. Trong trường hợp này, một đối tượng của thực thể này chỉ có thể được liên kết với một đối tượng của thực thể khác. Ví dụ: trên một số trang web, người dùng chỉ có thể có một blog. Tức là nảy sinh một mối quan hệ: một người dùng - một blog.

Thông thường, loại mối quan hệ này liên quan đến việc chia một bảng lớn thành nhiều bảng nhỏ. Bảng cha chính trong trường hợp này tiếp tục chứa dữ liệu được truy cập thường xuyên, trong khi bảng phụ thuộc con thường lưu trữ dữ liệu được truy cập ít thường xuyên hơn.

Về mặt này, khóa chính của bảng phụ thuộc đồng thời là khóa ngoại tham chiếu đến khóa chính của bảng chính.

Ví dụ: bảng Người dùng đại diện cho người dùng và có các cột sau:

    UserId(id, khóa chính)

    Tên (tên người dùng)

Và bảng Blogs đại diện cho blog của người dùng và có các cột sau:

    BlogId (mã định danh, khóa chính và khóa ngoại)

    Tên (tên blog)

Trong trường hợp này, cột BlogId sẽ lưu trữ giá trị từ cột UserId trong bảng người dùng. Tức là cột BlogId sẽ đóng vai trò vừa là khóa chính vừa là khóa ngoại.

Mối quan hệ một-nhiều

Đây là loại kết nối phổ biến nhất. Trong kiểu quan hệ này, nhiều hàng từ bảng con phụ thuộc vào một hàng trong bảng cha. Ví dụ: một blog có thể có nhiều bài viết. Trong trường hợp này, bảng blogs là bảng cha và bảng bài viết là bảng con. Tức là một blog - nhiều bài viết. Hoặc một ví dụ khác, một số cầu thủ bóng đá có thể chơi trong một đội bóng đá. Đồng thời, một cầu thủ bóng đá chỉ được chơi cho một đội một lần. Tức là một đội - nhiều người chơi.

Ví dụ: hãy có một bảng có tên Bài viết đại diện cho các bài viết trên blog và có các cột sau:

    ArticleId(id, khóa chính)

    BlogId (khóa ngoại)

    Tiêu đề (tiêu đề bài viết)

    Văn bản (văn bản bài viết)

Trong trường hợp này, cột BlogId từ bảng bài viết sẽ lưu trữ giá trị từ cột BlogId từ bảng blog.

mối quan hệ nhiều với nhiều

Với kiểu quan hệ này, một hàng trong bảng A có thể được liên kết với nhiều hàng trong bảng B. Ngược lại, một hàng trong bảng B có thể được liên kết với nhiều hàng trong bảng A. Một ví dụ điển hình là sinh viên và khóa học: một sinh viên có thể tham gia nhiều khóa học và theo đó, nhiều sinh viên có thể đăng ký vào một khóa học.

Một ví dụ khác là các bài viết và thẻ: một số thẻ có thể được xác định cho một bài viết và một thẻ có thể được xác định cho một số bài viết.

Nhưng trong SQL Server, ở cấp cơ sở dữ liệu, chúng ta không thể thiết lập mối quan hệ nhiều-nhiều trực tiếp giữa hai bảng. Điều này được thực hiện thông qua một bảng phân tầng phụ trợ. Đôi khi dữ liệu từ bảng phân tầng này đại diện cho một thực thể riêng biệt.

Ví dụ: trong trường hợp bài viết và thẻ, giả sử có bảng Thẻ có hai cột:

    TagId(mã định danh, khóa chính)

    Văn bản (gắn thẻ văn bản)

Ngoài ra, hãy có một bảng trung gian ArticleTags với các trường sau:

    TagId (mã định danh, khóa chính và khóa ngoại)

    ArticleIdId (mã định danh, khóa chính và khóa ngoại)

Về mặt kỹ thuật, chúng ta sẽ có hai mối quan hệ một-nhiều. Cột TagId từ bảng ArticleTags sẽ tham chiếu cột TagId từ bảng Tags. Và cột ArticleId từ bảng ArticleTags sẽ tham chiếu đến cột ArticleId từ bảng Articles. Nghĩa là, các cột TagId và ArticleId trong bảng ArticleTags biểu thị một khóa chính tổng hợp và cũng là các khóa ngoại cho mối quan hệ với các bảng Articles và Tags.

Tính toàn vẹn dữ liệu tham chiếu

Khi thay đổi khóa chính và khóa ngoại, cần lưu ý khía cạnh sau: tính toàn vẹn dữ liệu tham chiếu(tính toàn vẹn tham chiếu). Ý tưởng cơ bản của nó là hai bảng trong cơ sở dữ liệu lưu trữ cùng một dữ liệu để duy trì tính nhất quán. Tính toàn vẹn dữ liệu thể hiện mối quan hệ được xây dựng chính xác giữa các bảng với các liên kết chính xác giữa chúng. Trong trường hợp nào tính toàn vẹn dữ liệu có thể bị vi phạm:

    Xóa bất thường(xóa bất thường). Xảy ra khi một hàng bị xóa khỏi bảng chính. Trong trường hợp này, khóa ngoại từ bảng phụ thuộc tiếp tục tham chiếu đến hàng đã xóa khỏi bảng chính

    Sự chèn bất thường(chèn bất thường). Xảy ra khi một hàng được chèn vào bảng phụ thuộc. Trong trường hợp này, khóa ngoại từ bảng phụ thuộc không khớp với khóa chính của bất kỳ hàng nào trong bảng chính.

    Cập nhật các điểm bất thường(cập nhật sự bất thường). Với sự bất thường như vậy, một số hàng của cùng một bảng có thể chứa dữ liệu thuộc cùng một đối tượng. Khi bạn thay đổi dữ liệu ở một hàng, nó có thể xung đột với dữ liệu ở hàng khác.

Xóa bất thường

Để giải quyết vấn đề bất thường khi xóa, bạn phải đặt một trong hai ràng buộc đối với khóa ngoại:

    Nếu một hàng từ bảng phụ thuộc nhất thiết phải có một hàng từ bảng chính thì thao tác xóa tầng sẽ được đặt cho khóa ngoại. Nghĩa là, khi một hàng bị xóa khỏi bảng chính, (các) hàng liên kết sẽ bị xóa khỏi bảng phụ thuộc.

    Nếu một hàng trong bảng phụ thuộc không cho phép có mối quan hệ nào với một hàng trong bảng chính (nghĩa là mối quan hệ đó là tùy chọn), thì khóa ngoại được đặt thành NULL khi hàng liên quan bị xóa khỏi bảng chính. Cột khóa ngoại phải có giá trị rỗng.

Sự chèn bất thường

Để giải quyết vấn đề chèn bất thường khi thêm dữ liệu vào bảng phụ thuộc, cột đại diện cho khóa ngoại phải có giá trị rỗng. Và do đó, nếu đối tượng được thêm vào không có kết nối với bảng chính thì cột khóa ngoài sẽ chứa giá trị NULL.

Cập nhật các điểm bất thường

Để giải quyết vấn đề cập nhật bất thường, chuẩn hóa được sử dụng, điều này sẽ được thảo luận sau.