Câu trả lời:
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Ô .
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
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.
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.
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.
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ó).
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
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:
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
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.
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.