Chuẩn hóa (hay Chuẩn hóa) là gì?


104

Tại sao những người làm cơ sở dữ liệu lại tiếp tục chuẩn hóa?

Nó là gì? Nó giúp ích như thế nào?

Nó có áp dụng cho bất kỳ thứ gì bên ngoài cơ sở dữ liệu không?

Câu trả lời:


171

Chuẩn hóa về cơ bản là thiết kế một lược đồ cơ sở dữ liệu sao cho tránh được dữ liệu trùng lặp và dư thừa. Nếu một số phần dữ liệu bị trùng lặp ở một số nơi trong cơ sở dữ liệu, sẽ có nguy cơ là nó được cập nhật ở một nơi chứ không phải nơi khác, dẫn đến hỏng dữ liệu.

Có một số mức độ chuẩn hóa từ 1. dạng bình thường đến 5. dạng bình thường. Mỗi biểu mẫu bình thường mô tả cách thoát khỏi một số vấn đề cụ thể, thường liên quan đến dự phòng.

Một số lỗi chuẩn hóa điển hình:

(1) Có nhiều hơn một giá trị trong một ô. Thí dụ:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

Ở đây cột "Xe" (là một chuỗi) có một số giá trị. Điều đó vi phạm biểu mẫu bình thường đầu tiên, nói rằng mỗi ô chỉ nên có một giá trị. Chúng ta có thể bình thường hóa vấn đề này bằng cách có một hàng riêng cho mỗi xe:

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

Vấn đề với việc có nhiều giá trị trong một ô là khó cập nhật, khó truy vấn và bạn không thể áp dụng các chỉ mục, ràng buộc, v.v.

(2) Có dữ liệu không phải khóa dư thừa (tức là dữ liệu lặp lại không cần thiết trong một số hàng). Thí dụ:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

Thiết kế này là một vấn đề vì tên được lặp lại trên mỗi cột, mặc dù tên luôn được xác định bởi UserId. Điều này làm cho nó về mặt lý thuyết có thể thay đổi tên của Sue ở một hàng chứ không phải hàng khác, đó là lỗi dữ liệu. Vấn đề được giải quyết bằng cách chia bảng thành hai và tạo mối quan hệ khóa chính / khóa ngoại:

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Bây giờ có vẻ như chúng ta vẫn còn dữ liệu thừa vì UserId được lặp lại; Tuy nhiên, ràng buộc PK / FK đảm bảo rằng các giá trị không thể được cập nhật một cách độc lập, do đó tính toàn vẹn được an toàn.

Nó quan trọng? Vâng, nó rất quan trọng. Bằng cách có một cơ sở dữ liệu bị lỗi chuẩn hóa, bạn có nguy cơ nhận được dữ liệu không hợp lệ hoặc bị hỏng vào cơ sở dữ liệu. Vì dữ liệu "tồn tại mãi mãi" nên rất khó để loại bỏ dữ liệu bị hỏng khi lần đầu tiên nó được đưa vào cơ sở dữ liệu.

Đừng sợ hãi về sự bình thường hóa . Các định nghĩa kỹ thuật chính thức về các mức chuẩn hóa là khá khó hiểu. Nó làm cho nó nghe như chuẩn hóa là một quá trình toán học phức tạp. Tuy nhiên, chuẩn hóa về cơ bản chỉ là cách hiểu thông thường và bạn sẽ thấy rằng nếu bạn thiết kế một lược đồ cơ sở dữ liệu theo cách hiểu thông thường thì nó thường sẽ được chuẩn hóa hoàn toàn.

Có một số quan niệm sai lầm xung quanh việc chuẩn hóa:

  • một số người tin rằng cơ sở dữ liệu chuẩn hóa chậm hơn và việc không chuẩn hóa sẽ cải thiện hiệu suất. Tuy nhiên, điều này chỉ đúng trong những trường hợp rất đặc biệt. Thông thường, một cơ sở dữ liệu chuẩn hóa cũng là nhanh nhất.

  • đôi khi quá trình chuẩn hóa được mô tả như một quá trình thiết kế dần dần và bạn phải quyết định "khi nào thì dừng lại". Nhưng thực ra các mức chuẩn hóa chỉ mô tả các vấn đề cụ thể khác nhau. Vấn đề được giải quyết bởi các dạng thông thường ở trên NF thứ 3 là những vấn đề khá hiếm gặp ngay từ đầu, vì vậy rất có thể giản đồ của bạn đã ở trong 5NF.

Nó có áp dụng cho bất kỳ thứ gì bên ngoài cơ sở dữ liệu không? Không trực tiếp, không. Các nguyên tắc chuẩn hóa khá cụ thể đối với cơ sở dữ liệu quan hệ. Tuy nhiên, chủ đề cơ bản chung - mà bạn không nên có dữ liệu trùng lặp nếu các trường hợp khác nhau có thể không đồng bộ - có thể được áp dụng rộng rãi. Về cơ bản đây là nguyên tắc KHÔ .


4
Ví dụ bạn đưa ra cho bình thường đầu tiên không chính xác. Tôi luôn nhớ ba dạng thông thường đầu tiên bởi các thuật ngữ lặp lại, dư thừa, không phụ thuộc. Dữ liệu lặp lại đề cập đến khi các nhà phát triển cơ sở dữ liệu mới làm quen viết các định nghĩa bảng bao gồm các cột như DogName1, DogName2, DogName3, v.v.
Bill

2
@Bill: Tại sao bạn cho rằng ví dụ tôi cung cấp là không đúng? Bạn có biết định nghĩa của 1NF trong đó ví dụ sẽ OK không?
JacquesB

Làm thế nào mà chuẩn hóa lại không cần thiết trong lập trình hướng đối tượng - mà chỉ khi nói đến cơ sở dữ liệu? Tôi nghĩ rằng đã có một quy trình chuẩn hóa được tích hợp sẵn với cốt lõi của lập trình hướng đối tượng là hết - phải không?
Lealo

@Lealo Không, không hề. Bạn luôn có thể ánh xạ trạng thái của thiết kế OO một cách đáng kể với cơ sở dữ liệu / thiết kế "quan hệ" với các bảng - đó là ORM - nhưng cơ sở dữ liệu / thiết kế bạn nhận được là bản diễn lại quan hệ của thiết kế OO, không phải là đại diện quan hệ của các doanh nghiệp , và không chỉ là đại diện quan hệ của thiết kế OO rõ ràng phụ thuộc vào bản cập nhật bất thường & dư thừa mà bình thường quản lý nhưng các phương pháp OO phải thực thi thích hợp (không có giấy tờ) (phức tạp) trở ngại ( "đại diện bất biến") bằng tay.
philipxy

@Lealo: Nguyên tắc áp dụng cho OOP ở mức độ mà bạn không bao giờ được có cùng một thông tin (ở dạng có thể thay đổi) trong hai đối tượng khác nhau, vì sau đó chúng có thể trở nên không đồng bộ.
JacquesB

45

Các quy tắc chuẩn hóa (nguồn: không xác định)

  • Chìa khóa ( 1NF )
  • Toàn bộ chìa khóa ( 2NF )
  • và không có gì ngoài chìa khóa ( 3NF )

... Vậy giúp tôi Codd.


12
Tôi nghĩ điều này hơi mơ hồ nếu không có ngữ cảnh thích hợp, phải không?
Rik 29/10/08

3
Nó có thể hơi mơ hồ, nhưng đó là một lời nhắc nhở tuyệt vời cho những người có bối cảnh. Tôi biết chuẩn hóa là gì và làm thế nào để tiếp tục nó, nhưng tôi không bao giờ có thể nhớ từng biểu mẫu là gì.
Benjamin Autin 29/10/08

1
wikipedia giải thích điều này ở đây - "Yêu cầu sự tồn tại của" khóa "đảm bảo rằng bảng nằm trong 1NF; yêu cầu các thuộc tính không phải khóa phụ thuộc vào" toàn bộ khóa "đảm bảo 2NF; yêu cầu thêm rằng các thuộc tính không phải khóa phụ thuộc vào" không có gì nhưng khóa "đảm bảo 3NF."
Kcats Wolfrevo

Theo wikipedia nguồn là Bill Kent: "[Mọi] [thuộc tính] không phải khóa phải cung cấp thông tin về khóa, toàn bộ khóa, và không có gì ngoài khóa."
apteryx

19

Quan trọng nhất là nó phục vụ để loại bỏ trùng lặp từ các bản ghi cơ sở dữ liệu. Ví dụ: nếu bạn có nhiều hơn một nơi (bảng) nơi tên của một người có thể xuất hiện, bạn di chuyển tên đó sang một bảng riêng biệt và tham chiếu nó ở mọi nơi khác. Bằng cách này, nếu bạn cần thay đổi tên người sau này, bạn chỉ phải thay đổi nó ở một nơi.

Điều quan trọng là thiết kế cơ sở dữ liệu thích hợp và về lý thuyết, bạn nên sử dụng nó càng nhiều càng tốt để giữ cho dữ liệu của bạn toàn vẹn. Tuy nhiên, khi truy xuất thông tin từ nhiều bảng, bạn đang mất một số hiệu suất và đó là lý do tại sao đôi khi bạn có thể thấy các bảng cơ sở dữ liệu không chuẩn hóa (còn được gọi là phẳng) được sử dụng trong các ứng dụng quan trọng về hiệu suất.

Lời khuyên của tôi là nên bắt đầu với mức độ chuẩn hóa tốt và chỉ thực hiện việc khử chuẩn hóa khi thực sự cần thiết

PS cũng kiểm tra bài viết này: http://en.wikipedia.org/wiki/Database_normalization để đọc thêm về chủ đề này và về cái gọi là hình thức bình thường


Bạn cũng sẽ khá ngạc nhiên về mức độ thực sự cần thiết trong các ứng dụng giao dịch. Trong một ứng dụng quái vật mà tôi đã làm mô hình dữ liệu, một lược đồ với 560 bảng chỉ có 4 mục dữ liệu không chuẩn hóa.
ConcernedOfTunbridgeWells

Nó ngăn chặn "cập nhật dị thường". Nó thực hiện điều này bằng cách loại bỏ một số loại trùng lặp.
S.Lott 29/10/08

"Lời khuyên của tôi là nên bắt đầu với mức độ chuẩn hóa tốt và chỉ thực hiện việc khử chuẩn hóa khi thực sự cần thiết". Một lời khuyên này là một lời khuyên rất tồi tệ! Tôi vẫn không thấy bất kỳ hình ảnh minh họa thích hợp nào về "lý thuyết giả" này. Điểm trừ 1.
Philippe Grondier 29/10/08

7

Chuẩn hóa một thủ tục được sử dụng để loại bỏ dư thừa và phụ thuộc chức năng giữa các cột trong bảng.

Có một số hình thức bình thường, thường được biểu thị bằng một số. Một con số cao hơn có nghĩa là ít dư thừa và phụ thuộc hơn. Bất kỳ bảng SQL nào đều ở dạng 1NF (dạng chuẩn đầu tiên, khá nhiều theo định nghĩa) Chuẩn hóa có nghĩa là thay đổi lược đồ (thường phân vùng các bảng) theo cách có thể đảo ngược, tạo ra một mô hình giống hệt nhau về mặt chức năng, ngoại trừ ít dư thừa và phụ thuộc hơn.

Sự dư thừa và phụ thuộc của dữ liệu là không mong muốn vì nó có thể dẫn đến sự mâu thuẫn khi sửa đổi dữ liệu.


5

Nó nhằm giảm bớt sự dư thừa của dữ liệu.

Để có một cuộc thảo luận chính thức hơn, hãy xem http://en.wikipedia.org/wiki/Database_normalization trên Wikipedia

Tôi sẽ đưa ra một ví dụ hơi đơn giản.

Giả sử cơ sở dữ liệu của một tổ chức thường chứa các thành viên gia đình

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

có thể được bình thường hóa như

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

và một bàn ăn gia đình

ID, address
27 123 Main St.

Chuẩn hóa gần hoàn thành (BCNF) thường không được sử dụng trong sản xuất, nhưng là một bước trung gian. Khi bạn đã đặt cơ sở dữ liệu vào BCNF, bước tiếp theo thường là Hủy chuẩn hóa nó theo cách hợp lý để tăng tốc các truy vấn và giảm độ phức tạp của một số chèn phổ biến nhất định. Tuy nhiên, bạn không thể làm tốt điều này nếu không chuẩn hóa nó trước.

Ý tưởng là thông tin dư thừa được giảm xuống một mục duy nhất. Điều này đặc biệt hữu ích trong các trường như địa chỉ, trong đó ông Chris gửi địa chỉ của mình là Đơn vị-7 123 Main St. và Bà Chris liệt kê Suite-7 123 Main Street, sẽ hiển thị trong bảng gốc dưới dạng hai địa chỉ riêng biệt.

Thông thường, kỹ thuật được sử dụng là tìm các phần tử lặp lại và tách các trường đó thành một bảng khác với các id duy nhất và thay thế các phần tử lặp lại bằng một khóa chính tham chiếu đến bảng mới.


1
BCNF không phải là "hoàn hảo". Các biểu mẫu bình thường cao hơn tồn tại, lên đến 6NF, trong đó tất cả các bảng của bạn chỉ là một khóa và một giá trị dữ liệu. Tuy nhiên, nó hiếm khi được sử dụng
Rik 29/10/08

Tôi không đồng ý rằng BCNF hiếm khi được sử dụng và thường không chuẩn hóa. Trên thực tế, ví dụ chuẩn hóa của bạn đã có trong BCNF, và nếu bạn không chuẩn hóa nó, bạn sẽ trở lại hình vuông.
JacquesB

3

Trích dẫn CJ Ngày: Lý thuyết là thực tế.

Khởi hành từ quá trình chuẩn hóa sẽ dẫn đến một số dị thường nhất định trong cơ sở dữ liệu của bạn.

Khởi hành từ Biểu mẫu Thông thường Đầu tiên sẽ gây ra sự bất thường về truy cập, có nghĩa là bạn phải phân tách và quét các giá trị riêng lẻ để tìm những gì bạn đang tìm kiếm. Ví dụ: nếu một trong các giá trị là chuỗi "Ford, Cadillac" như được đưa ra bởi phản hồi trước đó và bạn đang tìm kiếm tất cả các lần xuất hiện của "Ford", bạn sẽ phải mở chuỗi và nhìn vào chuỗi con. Điều này, ở một mức độ nào đó, đánh bại mục đích lưu trữ dữ liệu trong cơ sở dữ liệu quan hệ.

Định nghĩa về Dạng chuẩn đầu tiên đã thay đổi kể từ năm 1970, nhưng những khác biệt đó bây giờ không cần bạn quan tâm. Nếu bạn thiết kế bảng SQL của mình bằng mô hình dữ liệu quan hệ, các bảng của bạn sẽ tự động ở dạng 1NF.

Các chuyến khởi hành từ Biểu mẫu Thông thường Thứ hai trở lên sẽ gây ra sự bất thường về cập nhật, vì cùng một dữ kiện được lưu trữ ở nhiều nơi. Những vấn đề này làm cho không thể lưu trữ một số dữ kiện mà không lưu trữ các dữ kiện khác có thể không tồn tại, và do đó phải được phát minh ra. Hoặc khi các dữ kiện thay đổi, bạn có thể phải xác định vị trí tất cả các địa điểm lưu trữ dữ kiện và cập nhật tất cả những nơi đó, kẻo bạn sẽ có một cơ sở dữ liệu mâu thuẫn với chính nó. Và, khi bạn xóa một hàng khỏi cơ sở dữ liệu, bạn có thể thấy rằng nếu làm vậy, bạn đang xóa nơi duy nhất mà một dữ kiện vẫn cần được lưu trữ.

Đây là những vấn đề logic, không phải vấn đề hiệu suất hoặc vấn đề không gian. Đôi khi bạn có thể khắc phục những bất thường về cập nhật này bằng cách lập trình cẩn thận. Đôi khi (thường xuyên) tốt hơn là bạn nên ngăn chặn các vấn đề ngay từ đầu bằng cách tuân thủ các biểu mẫu thông thường.

Bất chấp giá trị của những gì đã được nói, cần đề cập rằng chuẩn hóa là cách tiếp cận từ dưới lên, không phải là cách tiếp cận từ trên xuống. Nếu bạn tuân theo một số phương pháp luận nhất định trong phân tích dữ liệu và trong thiết kế nội bộ của mình, bạn có thể được đảm bảo rằng thiết kế ít nhất sẽ tuân theo 3NF. Trong nhiều trường hợp, thiết kế sẽ được chuẩn hóa hoàn toàn.

Nơi bạn có thể thực sự muốn áp dụng các khái niệm được dạy theo cách chuẩn hóa là khi bạn được cung cấp dữ liệu kế thừa, từ cơ sở dữ liệu kế thừa hoặc từ các tệp được tạo thành từ hồ sơ và dữ liệu được thiết kế hoàn toàn không biết về các dạng thông thường và hậu quả của việc khởi động từ họ. Trong những trường hợp này, bạn có thể cần phải phát hiện ra những điểm khác biệt so với quá trình chuẩn hóa và chỉnh sửa thiết kế.

Cảnh báo: bình thường hóa thường được dạy với âm bội tôn giáo, như thể mọi hành động rời khỏi chuẩn hóa hoàn toàn đều là tội lỗi, xúc phạm Codd. (chơi chữ nhỏ ở đó). Đừng mua cái đó. Khi bạn thực sự, thực sự học thiết kế cơ sở dữ liệu, bạn sẽ không chỉ biết cách tuân theo các quy tắc mà còn biết khi nào là an toàn để phá vỡ chúng.


2

Chuẩn hóa là một trong những khái niệm cơ bản. Có nghĩa là hai thứ không ảnh hưởng lẫn nhau.

Trong cơ sở dữ liệu cụ thể có nghĩa là hai (hoặc nhiều) bảng không chứa cùng một dữ liệu, tức là không có bất kỳ dư thừa nào.

Ngay từ cái nhìn đầu tiên, điều đó thực sự tốt vì cơ hội của bạn để thực hiện một số vấn đề đồng bộ hóa gần bằng 0, bạn luôn biết dữ liệu của mình ở đâu, v.v. Nhưng, có thể, số lượng bảng của bạn sẽ tăng lên và bạn sẽ gặp vấn đề để vượt qua dữ liệu và để có được một số kết quả tóm tắt.

Vì vậy, cuối cùng bạn sẽ kết thúc với thiết kế cơ sở dữ liệu không được chuẩn hóa thuần túy, với một số dư thừa (nó sẽ ở một số mức độ chuẩn hóa có thể có).


2

Chuẩn hóa là gì?

Chuẩn hóa là một quy trình chính thức khôn ngoan từng bước cho phép chúng ta phân rã các bảng cơ sở dữ liệu theo cách vừa dư thừa dữ liệu vừa cập nhật các điểm bất thường giảm thiểu .

Quá trình bình thường hóa Courtesy
nhập mô tả hình ảnh ở đây

Dạng chuẩn đầu tiên nếu và chỉ khi miền của mỗi thuộc tính chỉ chứa các giá trị nguyên tử (giá trị nguyên tử là một giá trị không thể chia được) và giá trị của mỗi thuộc tính chỉ chứa một giá trị duy nhất từ ​​miền đó (ví dụ: - miền cho cột giới tính là: "M", "F".).

Biểu mẫu bình thường đầu tiên thực thi các tiêu chí sau:

  • Loại bỏ các nhóm lặp lại trong các bảng cá nhân.
  • Tạo một bảng riêng cho từng tập dữ liệu liên quan.
  • Xác định từng bộ dữ liệu liên quan bằng khóa chính

Dạng chuẩn thứ hai = 1NF + không có phụ thuộc từng phần tức là Tất cả các thuộc tính không phải khóa đều phụ thuộc đầy đủ chức năng vào khóa chính.

Hình thức bình thường thứ ba = 2NF + không có phụ thuộc bắc cầu tức là Tất cả các thuộc tính không khóa đều phụ thuộc đầy đủ chức năng TRỰC TIẾP chỉ vào khóa chính.

Boyce-Codd dạng bình thường (hoặc BCNF hoặc 3,5NF) là một phiên bản mạnh hơn một chút của dạng bình thường thứ ba (3NF).

Lưu ý: - Dạng chuẩn thứ hai, thứ ba và Boyce-Codd liên quan đến các phụ thuộc hàm. Ví dụ

Dạng chuẩn thứ tư = 3NF + loại bỏ các phần phụ thuộc Nhiều giá trị

Dạng chuẩn thứ năm = 4NF + loại bỏ các phụ thuộc nối


0

Như Martin Kleppman đã nói trong cuốn sách Thiết kế các ứng dụng chuyên sâu về dữ liệu:

Tài liệu về mô hình quan hệ phân biệt một số dạng bình thường khác nhau, nhưng sự khác biệt này ít được quan tâm thực tế. Theo quy tắc chung, nếu bạn đang sao chép các giá trị có thể được lưu trữ chỉ ở một nơi, thì lược đồ sẽ không được chuẩn hóa.


-10

Nó giúp ngăn dữ liệu trùng lặp (và tệ hơn là xung đột).

Tuy nhiên, có thể có tác động tiêu cực đến hiệu suất.


Đã từng làm việc với cả dữ liệu chuẩn hóa và không chuẩn hóa, tôi thích giảm tốc độ khi chuẩn hóa hơn là mất hoặc gặp khó khăn trong việc duy trì ứng dụng hoặc cơ sở dữ liệu.
Schalk Versteeg

1
các công cụ cơ sở dữ liệu hiện đại sử dụng bộ nhớ đệm, điều này thường làm cho cơ sở dữ liệu được chuẩn hóa hiệu quả hơn cơ sở dữ liệu chưa được chuẩn hóa. nếu nghi ngờ, hãy đo lường.
Steven A. Lowe

1
Một thiết kế không chuẩn hóa có thể nhanh hơn cho một truy vấn cụ thể, nhưng một thiết kế chuẩn hóa mang lại một sự thỏa hiệp bằng cách mang lại hiệu suất hợp lý cho nhiều loại truy vấn hơn.
Bill Karwin

@Bill, tôi hơi không đồng ý. Cách duy nhất để cơ sở dữ liệu chuẩn hóa hoàn toàn giúp hiệu suất là ngăn hệ thống phải xử lý dữ liệu dư thừa. Ngoài ra, đó là tình huống xấu nhất từ ​​quan điểm hiệu suất.
Brian Knoblauch

Câu trả lời này không có giá trị gì so với các câu trả lời hiện có.
cimmanon
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.