Cơ sở dữ liệu biểu mẫu bình thường là gì và bạn có thể cho ví dụ? [đóng cửa]


277

Trong thiết kế cơ sở dữ liệu quan hệ, có một khái niệm về chuẩn hóa cơ sở dữ liệu hoặc đơn giản là chuẩn hóa cơ sở dữ liệu, đó là một quá trình tổ chức các cột (thuộc tính) và bảng (quan hệ) để giảm sự dư thừa dữ liệu và cải thiện tính toàn vẹn dữ liệu. (như được viết trên Wikipedia ).

Vì hầu hết các bài viết có phần kỹ thuật và do đó khó hiểu hơn, tôi đang yêu cầu ai đó viết một lời giải thích dễ hiểu hơn dựa trên các ví dụ về ý nghĩa của 1NF, 2NF, 3NF, thậm chí 3.5NF (Boyce-Codd).

Câu trả lời:


435

1NF là dạng cơ bản nhất của các dạng thông thường - mỗi ô trong một bảng chỉ chứa một phần thông tin và không thể có các hàng trùng lặp.

2NF và 3NF đều phụ thuộc vào khóa chính. Hãy nhớ rằng một khóa chính có thể được tạo thành từ nhiều cột. Như Chris đã nói trong câu trả lời của mình:

Dữ liệu phụ thuộc vào khóa [1NF], toàn bộ khóa [2NF] và không có gì ngoài khóa [3NF] (vì vậy hãy giúp tôi Codd ).

2NF

Giả sử bạn có một bảng chứa các khóa học được thực hiện trong một học kỳ nhất định và bạn có dữ liệu sau:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

Đây không phảitrong 2NF , vì cột thứ tư không phụ thuộc vào toàn bộ khóa - mà chỉ là một phần của nó. Tên khóa học phụ thuộc vào ID của Khóa học, nhưng không liên quan gì đến học kỳ đó. Vì vậy, như bạn có thể thấy, chúng tôi có thông tin trùng lặp - một số hàng cho chúng tôi biết IT101 đang lập trình và IT102 là Cơ sở dữ liệu. Vì vậy, chúng tôi khắc phục điều đó bằng cách di chuyển tên khóa học vào một bảng khác, trong đó CourseID là khóa ENTIRE.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

Không dư thừa!

3NF

Được rồi, vì vậy hãy nói rằng chúng tôi cũng thêm tên của giáo viên của khóa học và một số chi tiết về họ, vào RDBMS:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

Bây giờ, hy vọng rằng rõ ràng là Tên giáo viên phụ thuộc vào teacherID - vì vậy đây không phải3NF . Để khắc phục điều này, chúng tôi thực hiện nhiều thao tác giống như chúng tôi đã làm trong 2NF - lấy trường teacherName ra khỏi bảng này và đặt nó vào chính nó, trong đó có teacherID làm khóa.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

Không dư thừa !!

Một điều quan trọng cần nhớ là nếu một cái gì đó không có trong 1NF, thì nó cũng không nằm trong 2NF hoặc 3NF. Vì vậy, mỗi Biểu mẫu Bình thường bổ sung yêu cầu mọi thứ mà các biểu mẫu bình thường thấp hơn có, cộng với một số điều kiện bổ sung, tất cả phải được đáp ứng.


9
Chỉ cần nghĩ về nó về mối quan hệ giữa các sự vật. Nếu tôi hỏi bạn "tên của khóa học với ID IT101 là gì?", Bạn có thể cho tôi một câu trả lời, phải không? Tương tự, nếu tôi hỏi bạn "giáo viên nào có ID 332?" bạn có thể cho tôi biết đó là giáo viên. Do đó, tên khóa học phụ thuộc vào ID của nó.
Smashery

9
Tuy nhiên, bạn không thể đi theo một cách khác - nếu tôi hỏi bạn "ID của ông Jones là gì?" bạn có thể không thể đưa ra một câu trả lời duy nhất, vì có thể có hai ông Jones. Vì vậy, ID không phụ thuộc vào tên - đó là tên phụ thuộc vào ID.
Smashery

2
Bạn cũng có thể nghĩ về nó theo cách này - nhìn vào bảng thứ ba trở xuống (bảng đầu tiên có Tên giáo viên trong đó). Điều gì ngăn tôi có "Mr Jones" ở hàng đầu tiên, nhưng sau đó lại đưa "Mr Bloggs" vào hàng thứ hai? Tôi không nên được phép làm điều đó, bởi vì cả hai đều có ID là 332.
Smashery

30
@instantsetsuna - Giải thích đầy đủ: Tại một số tòa án, một nhân chứng được hỏi liệu họ có nói "Sự thật, toàn bộ sự thật, và không có gì ngoài sự thật, vì vậy hãy giúp tôi Chúa"; vì Chúa được coi là người có thẩm quyền khi biết bạn có nói thật không. Trong trường hợp cơ sở dữ liệu, chúng ta có thể nói "Dữ liệu phụ thuộc vào khóa, toàn bộ khóa và không có gì ngoài khóa, vì vậy hãy giúp tôi Codd". Ted Codd là người đã đưa ra ý tưởng về cơ sở dữ liệu quan hệ - những thứ dựa vào khóa, v.v., vì vậy anh sẽ là người có thẩm quyền trong trường hợp cơ sở dữ liệu quan hệ.
Smashery

5
@Smashery Sự khác biệt giữa 2NF và 3NF là gì?
Zo Có

119

Tôi chưa bao giờ có một trí nhớ tốt cho từ ngữ chính xác, nhưng trong lớp cơ sở dữ liệu của tôi, tôi nghĩ rằng giáo sư luôn nói điều gì đó như:

Dữ liệu phụ thuộc vào khóa [1NF], toàn bộ khóa [2NF] và không có gì ngoài khóa [3NF].


72
... hãy giúp tôi Codd. vi.wikipedia.org/wiki/Ted_Codd
Smashery

6
Vậy sự khác biệt giữa là The data depends on the key [1NF], nothing but the key [3NF]gì? Xin đừng nhầm lẫn chúng tôi, vì 1 câu trả lời không có ý nghĩa làm rõ câu trả lời nhưng làm khách truy cập bối rối!
Pratik

2
"mỗi ô trong một bảng chỉ chứa một phần thông tin và không thể có các hàng trùng lặp." - Tôi không thấy cách "Dữ liệu phụ thuộc vào khóa" khớp với tất cả điều đó.
Simon Forsberg

46

Dưới đây là một cách nhanh chóng, phải thừa nhận là chặt ra từng khúc phản ứng, nhưng trong một câu:

1NF: Bảng của bạn được tổ chức dưới dạng một tập hợp dữ liệu không có thứ tự và không có cột lặp lại.

2NF: Bạn không lặp lại dữ liệu trong một cột của bảng vì một cột khác.

3NF: Mỗi cột trong bảng của bạn chỉ liên quan đến khóa của bảng - bạn sẽ không có một cột trong bảng mô tả một cột khác trong bảng không phải là khóa.

Để biết thêm chi tiết, xem wikipedia ...


1
Theo như tôi có thể nói, việc tránh các nhóm lặp lại của 1NF không đề cập đến các cột lặp lại, mà là các cột đơn đại diện cho một số lượng giá trị lặp lại tùy ý cho cùng một thuộc tính, nghĩa là không phải là nguyên tử. Tôi dựa trên điều này, ví dụ: (1) stackoverflow.com/questions/23194292/ trên / (2) stackoverflow.com/questions/26357276/ Lỗi
underscore_d

34

1NF: Chỉ một giá trị trên mỗi cột

2NF: Tất cả các cột khóa không chính trong bảng phải phụ thuộc vào toàn bộ khóa chính.

3NF: Tất cả các cột khóa không chính trong bảng phải phụ thuộc TRỰC TIẾP trên toàn bộ khóa chính.

Tôi đã viết một bài viết chi tiết hơn ở đây


Bởi vì bạn đã không cung cấp thẩm quyền. Tôi đã chỉnh sửa câu trả lời để cung cấp ghi công.
Robert Harvey

Bất cứ khi nào có thể, bao gồm ví dụ trong câu trả lời chính nó. Một người dùng bình thường sẽ có thể đọc câu trả lời của bạn và nhận được một số giá trị từ nó mà không cần phải nhấp vào liên kết blog. Câu trả lời nên được khép kín, nói cách khác.
Robert Harvey

Tôi sẽ giữ cho rằng trong tâm trí. Cảm ơn bạn :)
Arcturus

3
Cũng lưu ý rằng câu hỏi này đã được hai năm tuổi và đã có câu trả lời được đánh giá cao đã được đánh dấu là chấp nhận bởi OP. Các câu trả lời muộn được cộng đồng xem xét kỹ lưỡng hơn để đánh giá liệu họ có thêm giá trị bổ sung chính hãng vào OP hay không.
Robert Harvey

3
@Arcturus đọc qua bài báo, vẫn là một trong những giải thích tốt hơn cho bình thường hóa ngoài kia.
Olian04
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.