Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thực hành / hướng dẫn tồn tại để tạo bảng không chuẩn hóa trong quá trình chuẩn hóa?

TL; DR Bạn cần tuân theo một thuật toán đã xuất bản để phân rã thành một dạng chuẩn nhất định.

PS Bạn không nhận được Nghệ sĩ từ đĩa CD gốc thông qua quá trình chuẩn hóa, vì bạn đã giới thiệu một cột mới. Nhưng giả sử bảng Artist có ý nghĩa rõ ràng. Tại sao bạn lại nghĩ rằng nó "một lần nữa không phải ở dạng thứ ba bình thường theo như tôi hiểu"? Nếu nghệ sĩ -> năm trong CD gốc thì nó cũng có trong Nghệ sĩ. Nhưng sau đó {artist}, với {artist_id}, là CK (khóa ứng viên) của Nghệ sĩ và Nghệ sĩ ở 3NF (và 5NF).

Từ phiên bản gốc của câu hỏi của bạn cộng với phiên bản hiện tại, bạn có một CD bảng cơ sở được đề xuất với các cột cd_id, tiêu đề, nhóm &năm, chứa các bộ giá trị trong đó cd cd_id có tiêu đề title được thực hiện bởi nhóm group hình thành vào năm năm . Cột cd_id là duy nhất, do đó là một CK. FD {group} -> năm cũng được giữ nguyên.

Chuẩn hóa không giới thiệu tên cột mới. Nó thay thế một bảng cơ sở được đề xuất bởi những người khác, mỗi bảng có một tập hợp con nhỏ hơn các cột của nó, luôn kết hợp với giá trị của nó. Chuẩn hóa lên đến BCNF dựa trên FD (phụ thuộc hàm), cũng là những gì xác định CK của bảng cơ sở. Vì vậy, câu hỏi của bạn không chứa một phân đoạn. Một phân tách có thể xảy ra gợi nhớ đến câu hỏi của bạn, có thể có hoặc không có bất kỳ thuộc tính cụ thể nào, sẽ là các bảng có tập hợp cột {cd_id, title, group} và {group, year}.

Các FD khác giữ nguyên bản gốc. Một số giữ lại vì những gì các cột là; một số nắm giữ vì CK; một số giữ vì {group} -> giữ năm; nói chung, một số cái nhất định giữ nguyên vì cả ba cái đó đều có. Và có thể những người khác nắm giữ vì những gì các bộ giá trị được cho là đi vào mối quan hệ và những tình huống có thể phát sinh. Bạn cần quyết định cho mọi FD khả thi cho dù nó được giữ.

Tất nhiên, bạn có thể đã được nói với rằng những thứ duy nhất nắm giữ là những thứ phải nắm giữ trong những trường hợp đó. Nhưng bạn sẽ không đã được thông báo rằng FD duy nhất nắm giữ là {group} -> năm, bởi vì có are FD tầm thường và mọi tập trên của CK xác định một cách chức năng mọi tập hợp cột .

Một định nghĩa của 3NF là một quan hệ nằm trong 2NF và không có cột không nguyên tố nào là phụ thuộc hàm quá độ vào bất kỳ CK nào. (Lưu ý rằng mỗi điều kiện liên quan đến các định nghĩa khác.) Nếu bạn muốn sử dụng điều này để tìm hiểu xem liệu mối quan hệ của bạn có nằm trong 3NF hay không thì tiếp theo bạn cần tìm hiểu tất cả CK là. Bạn có thể thực hiện điều này nhanh nhất thông qua một thuật toán thích hợp, nhưng bạn chỉ có thể xem tập hợp cột nào xác định theo chức năng mọi cột nhưng không chứa tập hợp nhỏ hơn như vậy, vì đó là CK. Sau đó, kiểm tra hai điều kiện trong định nghĩa.

Nếu bạn muốn chuẩn hóa thành 3NF thì bạn cần tuân theo một thuật toán để phân tách thành 3NF. Bạn không giải thích quy trình mà bạn nghĩ bạn nên làm theo. Nhưng nếu bạn không tuân theo một thuật toán đã được chứng minh thì bất kỳ thành phần nào bạn chọn có thể hoặc không phải lúc nào cũng kết hợp với nguyên bản và có thể hoặc không, mỗi thành phần có thể ở bất kỳ dạng thông thường cao hơn cụ thể nào. Lưu ý rằng ví dụ về phân tách bạn đã thấy không phải là bản trình bày của các thuật toán phân tách .

Các định nghĩa NF (dạng thông thường) đưa ra các điều kiện mà một quan hệ phải đáp ứng để nằm trong NF đó. Họ không cho bạn biết cách phân hủy nonloss (bảo toàn FD khi có thể) thành các quan hệ trong NF cao hơn. Mọi người đã nghiên cứu ra các thuật toán để tạo ra các phân tách thành các NF cụ thể. (Và việc phân hủy thành một NF nhất định nói chung không liên quan đến việc phân hủy đầu tiên thành NF thấp hơn. Trải qua các NF thấp hơn thực sự có thể ngăn chặn sự phân hủy NF tốt hơn của bản gốc được tạo ra khi bạn phân hủy theo NF cao hơn.)

Bạn cũng có thể không nhận ra rằng khi một số FD nắm giữ, thì một số FD khác phải giữ. Cái sau có thể được xác định thông qua tiên đề của Armstrong từ cái trước. Vì vậy, chỉ vì bạn đã phân rã để loại bỏ một FD cụ thể mà sự hiện diện của nó vi phạm một NF cụ thể không có nghĩa là không có một loạt những cái khác vi phạm nó mà bạn không xử lý. Chúng có thể hiện diện trong các thành phần mới. Hoặc chúng có thể không xuất hiện theo những cách có vấn đề, do đó bạn đã không "bảo quản" chúng khi có thể, dẫn đến thiết kế kém.

Tìm hiểu về các thuật toán NF cụ thể và đối với vấn đề NF và bản thân quá trình chuẩn hóa, trong sách giáo khoa / khóa học / bài thuyết trình của trường cao đẳng / đại học. Nhiều người đang trực tuyến.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL đếm tất cả các hàng thay vì đếm các hàng riêng lẻ

  2. php, pdo mysql không thể chèn bằng tham gia bên trong

  3. Cách sử dụng chèn hoặc thay thế trong bộ mã

  4. Kết nối mysql từ xa qua máy chủ miễn phí

  5. Trình tạo truy vấn Doctrine DATE_FORMAT không hoạt động