Tránh phụ thuộc Transitive để giúp đảm bảo bình thường hóa
Sự phụ thuộc chuyển tiếp trong cơ sở dữ liệu là mối quan hệ gián tiếp giữa các giá trị trong cùng một bảng gây ra sự phụ thuộc chức năng . Để đạt được tiêu chuẩn chuẩn hóa của Mẫu thông thường thứ ba (3NF), bạn phải loại bỏ bất kỳ sự phụ thuộc chuyển tiếp nào.
Theo bản chất của nó, một phụ thuộc chuyển tiếp đòi hỏi ba hoặc nhiều thuộc tính (hoặc cột cơ sở dữ liệu) có sự phụ thuộc chức năng giữa chúng, có nghĩa là Cột A trong bảng dựa vào Cột B thông qua cột C.
Hãy xem cách điều này có thể hoạt động.
Ví dụ phụ thuộc Transitive
TÁC GIẢ
Author_ID | Tác giả | Sách | Author_Nationality |
---|---|---|---|
Auth_001 | Thẻ Orson Scott | trò chơi của Ender | Hoa Kỳ |
Auth_001 | Thẻ Orson Scott | trò chơi của Ender | Hoa Kỳ |
Auth_002 | Margaret Atwood | The Handmaid's Tale | Canada |
Trong ví dụ AUTHORS ở trên:
- Sách → Tác giả : Tại đây, thuộc tính Sách xác định thuộc tính Tác giả . Nếu bạn biết tên sách, bạn có thể tìm hiểu tên của tác giả. Tuy nhiên, Tác giả không xác định Sách , bởi vì tác giả có thể viết nhiều sách. Ví dụ, chỉ vì chúng tôi biết tên tác giả Orson Scott Card, chúng tôi vẫn không biết tên sách.
- Tác giả → Author_Nationality : Tương tự như vậy, các thuộc tính tác giả xác định Author_Nationality , nhưng không phải là cách khác xung quanh; chỉ vì chúng ta biết quốc tịch không có nghĩa là chúng ta có thể xác định tác giả.
Nhưng bảng này giới thiệu một sự phụ thuộc chuyển tiếp:
- Sách → Author_Nationality: Nếu chúng ta biết tên sách, chúng ta có thể xác định quốc tịch thông qua cột Tác giả.
Tránh phụ thuộc Transitive
Để đảm bảo Hình thức thông thường thứ ba, hãy loại bỏ sự phụ thuộc chuyển tiếp.
Chúng tôi có thể bắt đầu bằng cách xóa cột Sách khỏi bảng Tác giả và tạo bảng Sách riêng biệt:
SÁCH
Book_ID | Sách | Author_ID |
---|---|---|
Book_001 | trò chơi của Ender | Auth_001 |
Book_001 | Trẻ em của tâm trí | Auth_001 |
Book_002 | The Handmaid's Tale | Auth_002 |
TÁC GIẢ
Author_ID | Tác giả | Author_Nationality |
---|---|---|
Auth_001 | Thẻ Orson Scott | Hoa Kỳ |
Auth_002 | Margaret Atwood | Canada |
Điều này có khắc phục được không? Hãy kiểm tra các phụ thuộc của chúng tôi ngay bây giờ:
Bảng BOOKS :
- Book_ID → Sách: Sách phụ thuộc vào Book_ID .
- Không có phụ thuộc khác trong bảng này tồn tại, vì vậy chúng tôi không sao. Lưu ý rằng khóa ngoài Author_ID liên kết bảng này với bảng AUTHORS thông qua khóa chính Author_ID của nó. Chúng tôi đã tạo ra một mối quan hệ để tránh sự phụ thuộc quá độ, một thiết kế quan trọng của cơ sở dữ liệu quan hệ.
Bảng AUTHORS :
- Author_ID → Tác giả: Tác giả phụ thuộc vào Author_ID .
- Tác giả → Author_Nationality: Quốc tịch có thể được xác định bởi tác giả.
- Author_ID → Author_Nationality: Quốc tịch có thể được xác định từ Author_ID thông qua thuộc tính Tác giả . Chúng tôi vẫn có sự phụ thuộc quá độ.
Chúng ta cần thêm một bảng thứ ba để chuẩn hóa dữ liệu này:
COUNTRIES
Country_ID | Quốc gia |
---|---|
Coun_001 | Hoa Kỳ |
Coun_002 | Canada |
TÁC GIẢ
Author_ID | Tác giả | Country_ID |
---|---|---|
Auth_001 | Thẻ Orson Scott | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Bây giờ chúng ta có ba bảng, sử dụng các khóa ngoài để liên kết giữa các bảng:
- Chìa khóa nước ngoài của bảng BOOK Author_ID liên kết một cuốn sách với một tác giả trong bảng AUTHORS .
- Khóa nước ngoài của bảng AUTHORS Country_ID liên kết tác giả đến một quốc gia trong bảng COUNTRIES.
- Bảng COUNTRIES không có khóa ngoại bởi vì nó không cần liên kết đến một bảng khác trong thiết kế này.
Tại sao phụ thuộc Transitive là thiết kế cơ sở dữ liệu xấu
Giá trị tránh phụ thuộc transitive để giúp đảm bảo 3NF là gì? Hãy xem xét bảng đầu tiên của chúng ta một lần nữa và xem các vấn đề nó tạo ra:
TÁC GIẢ
Author_ID | Tác giả | Sách | Author_Nationality |
---|---|---|---|
Auth_001 | Thẻ Orson Scott | trò chơi của Ender | Hoa Kỳ |
Auth_001 | Thẻ Orson Scott | Trẻ em của tâm trí | Hoa Kỳ |
Auth_002 | Margaret Atwood | The Handmaid's Tale | Canada |
Loại thiết kế này có thể đóng góp vào dị thường dữ liệu và mâu thuẫn, ví dụ:
- Nếu bạn xóa hai cuốn sách "Children of the Mind" và "Ender's Game", bạn sẽ xóa tác giả "Orson Scott Card" và quốc tịch của mình hoàn toàn khỏi cơ sở dữ liệu.
- Bạn không thể thêm tác giả mới vào cơ sở dữ liệu trừ khi bạn cũng thêm một cuốn sách; nếu tác giả chưa được xuất bản hoặc bạn không biết tên của một cuốn sách mà cô ấy đã viết ra thì sao?
- Nếu "Orson Scott Card" thay đổi quốc tịch của mình, bạn sẽ phải thay đổi nó trong tất cả các bản ghi mà anh ta xuất hiện. Có nhiều bản ghi với cùng một tác giả có thể dẫn đến dữ liệu không chính xác: nếu người nhập dữ liệu không nhận ra có nhiều bản ghi cho người đó và thay đổi dữ liệu chỉ trong một bản ghi?
- Bạn không thể xóa một cuốn sách như "The Handmaid's Tale" mà không xóa hoàn toàn tác giả.
Đây chỉ là một số lý do tại sao bình thường hóa , và tránh phụ thuộc transitive, bảo vệ dữ liệu và đảm bảo tính nhất quán.