Khi nào bạn nên không chuẩn hóa?


45

Tôi nghĩ rằng tất cả chúng ta đều quen thuộc với chuẩn hóa cơ sở dữ liệu .

Câu hỏi của tôi là: một số hướng dẫn mà bạn sử dụng khi bạn muốn không chuẩn hóa các bảng là gì?


3
Các trang web StackExchange có một lợi thế duy nhất so với các trang web khác trên internet trong đó 1) chúng cho phép các câu trả lời tốt nhất trở thành dễ tìm thấy nhất và 2) các câu trả lời tốt nhất được xác định bởi cộng đồng. Do đó, tôi tin rằng trang web này và internet sẽ có lợi từ câu hỏi này, mặc dù trước đó nó loại đi ngược lại các câu hỏi thường gặp .
Richard


1
Có thể trùng lặp / thông tin liên quan Khi nào không chuẩn hóa thiết kế cơ sở dữ liệu
John Sansom

Câu trả lời:


34

Không chuẩn hóa khi hoạt động OLAP, chuẩn hóa khi OLTP (từ bài viết được liên kết trong phần Không chuẩn hóa)

Cơ sở dữ liệu dành cho xử lý giao dịch trực tuyến (OLTP) thường được chuẩn hóa hơn so với cơ sở dữ liệu dành cho xử lý phân tích trực tuyến (OLAP). Các ứng dụng OLTP được đặc trưng bởi một khối lượng lớn các giao dịch nhỏ như cập nhật hồ sơ bán hàng tại quầy thanh toán siêu thị. Kỳ vọng là mỗi giao dịch sẽ rời khỏi cơ sở dữ liệu ở trạng thái nhất quán. Ngược lại, cơ sở dữ liệu dành cho hoạt động OLAP chủ yếu là cơ sở dữ liệu "đọc chủ yếu". Các ứng dụng OLAP có xu hướng trích xuất dữ liệu lịch sử đã tích lũy trong một khoảng thời gian dài. Đối với các cơ sở dữ liệu như vậy, dữ liệu dư thừa hoặc "không chuẩn hóa" có thể tạo điều kiện cho các ứng dụng kinh doanh thông minh. Cụ thể, các bảng chiều trong lược đồ sao thường chứa dữ liệu không chuẩn hóa. Dữ liệu không chuẩn hóa hoặc dự phòng phải được kiểm soát cẩn thận trong quá trình trích xuất, chuyển đổi, tải (ETL) và người dùng không được phép xem dữ liệu cho đến khi nó ở trạng thái nhất quán. Thay thế chuẩn hóa cho lược đồ sao là lược đồ bông tuyết. Trong nhiều trường hợp, nhu cầu không chuẩn hóa đã giảm đi khi máy tính và phần mềm RDBMS trở nên mạnh mẽ hơn, nhưng vì khối lượng dữ liệu thường tăng lên cùng với hiệu suất phần cứng và phần mềm, cơ sở dữ liệu OLAP vẫn thường sử dụng các lược đồ không chuẩn hóa.

Việc không chuẩn hóa cũng được sử dụng để cải thiện hiệu suất trên các máy tính nhỏ hơn như trong máy tính tiền và thiết bị di động, vì chúng có thể chỉ sử dụng dữ liệu để tra cứu (ví dụ: tra cứu giá). Việc không chuẩn hóa cũng có thể được sử dụng khi không có RDBMS cho nền tảng (như Palm) hoặc không có thay đổi nào được thực hiện đối với dữ liệu và phản hồi nhanh là rất quan trọng.


4
Tôi không chuẩn hóa khi tôi đang tạo báo cáo hoặc phân tích và tôi muốn kết quả nhanh chóng. Tất cả các chỉ mục trên thế giới có nhiều phép nối không bao giờ nhanh như một bảng không chuẩn hóa biểu thị dữ liệu được lưu trong bộ nhớ cache sẽ không thay đổi.
kevinsky

Cô đọng và rất hữu ích Tôi đã làm việc ở ngoại vi của DBA và điều này giúp mang lại nhiều thứ tròn đầy.
Jason P Sallinger

Nhiều ứng dụng có các bit của cả hai yêu cầu OLAP và OLTP, do đó, mọi nhà phát triển phụ trợ nên tìm hiểu cách kết hợp cả hai và cách cập nhật dữ liệu không chuẩn hóa.
JustAMartin

22

Bình thường hóa cho đến khi nó đau, không chuẩn hóa cho đến khi nó hoạt động (nghĩa là: hiệu suất trở nên chấp nhận được) :)


5
Đây có lẽ không phải là câu trả lời hay nhất, nhưng nó là một trong những lớp lót tốt nhất tôi từng thấy trên Stack Overflow :)
Owen

15

Một lý do có thể hợp lý để áp dụng sự không chuẩn hóa có kiểm soát là nếu nó cho phép bạn áp dụng một số ràng buộc toàn vẹn cho dữ liệu mà nếu không thì không thể. Hầu hết các DBMS SQL có hỗ trợ cực kỳ hạn chế cho các ràng buộc nhiều bảng. Trong SQL đôi khi cách hiệu quả duy nhất để thực hiện các ràng buộc nhất định là đảm bảo rằng các thuộc tính liên quan đến ràng buộc đều có trong cùng một bảng - ngay cả khi chuẩn hóa sẽ ra lệnh rằng chúng thuộc các bảng riêng biệt.

Sự không chuẩn hóa có kiểm soát có nghĩa là các cơ chế được thực hiện để đảm bảo rằng sự không nhất quán không thể phát sinh do dữ liệu dư thừa. Chi phí của các kiểm soát bổ sung này và rủi ro của dữ liệu không nhất quán cần được xem xét khi quyết định liệu việc không chuẩn hóa có đáng giá hay không.

Một lý do phổ biến khác cho việc không chuẩn hóa là cho phép một số thay đổi trong cấu trúc lưu trữ hoặc cho phép một số tối ưu hóa vật lý khác mà DBMS không cho phép. Theo nguyên tắc Độc lập dữ liệu vật lý, DBMS phải có phương tiện để cấu hình các cấu trúc lưu trữ nội bộ mà không cần thay đổi cách biểu diễn logic của dữ liệu trong cơ sở dữ liệu. Thật không may, nhiều DBMS rất hạn chế các tùy chọn triển khai vật lý có sẵn cho bất kỳ lược đồ cơ sở dữ liệu nào. Họ có xu hướng thỏa hiệp độc lập cơ sở dữ liệu vật lý bằng cách chỉ hỗ trợ triển khai dưới mức tối ưu của mô hình logic mong muốn.

Điều này là hiển nhiên nhưng vẫn cần phải nói: trong mọi trường hợp, đó chỉ là những thay đổi trong các tính năng triển khai vật lý có thể quyết định hiệu năng - các tính năng như cấu trúc dữ liệu nội bộ, tệp, lập chỉ mục, phần cứng, v.v. Chuẩn hóa và không chuẩn hóa không liên quan gì đến hiệu suất hoặc tối ưu hóa lưu trữ.


4

Không chuẩn hóa nếu bạn thường xuyên truy cập dữ liệu tính toán, như được đề xuất trong câu trả lời cho câu hỏi này . Chi phí lưu trữ và duy trì dữ liệu tính toán thường sẽ thấp hơn chi phí tính toán lại nhiều lần nếu hồ sơ tải của bạn nặng.


Lưu ý rằng điều này đặc biệt hữu ích nếu việc không chuẩn hóa chỉ đơn giản là các giá trị bộ đệm . Vì vậy, vẫn còn một bộ sưu tập các bảng / trường được chuẩn hóa cơ bản . Nghĩa là, đối với mỗi giá trị, cần có một ô "chính" duy nhất giữ giá trị đó - các giá trị khác được biết chỉ là bản sao hoặc phép tính từ chủ đó - và trừ khi có một lợi ích mạnh mẽ nào đó để làm khác, hãy giữ tất cả các ô chính trong các mối quan hệ bình thường hóa.
ToolmakerSteve

3

Tôi thường xuyên không chuẩn hóa để tôi có thể thực thi tính toàn vẹn dữ liệu với các ràng buộc. Một ví dụ là một câu hỏi gần đây trên trang web này - tôi sao chép một cột trong một bảng khác, để tôi có thể sử dụng một ràng buộc CHECK để so sánh nó với một cột khác. Một ví dụ khác về kỹ thuật này là bài viết trên blog của tôi .

Bạn không thể sử dụng các ràng buộc CHECK để so sánh các cột trong các hàng khác nhau hoặc trong các bảng khác nhau, trừ khi bạn bao bọc chức năng đó trong các UDF vô hướng được gọi là một ràng buộc CHECK. Điều gì xảy ra nếu bạn thực sự cần so sánh các cột trong các hàng khác nhau hoặc trong các bảng khác nhau để thực thi quy tắc kinh doanh? Ví dụ: giả sử bạn biết giờ làm việc của bác sĩ và bạn muốn chắc chắn rằng tất cả các cuộc hẹn phù hợp trong giờ làm việc? Tất nhiên, bạn có thể sử dụng trình kích hoạt hoặc quy trình được lưu trữ để thực hiện quy tắc kinh doanh này, nhưng không phải trình kích hoạt cũng như quy trình được lưu trữ có thể đảm bảo 100% rằng tất cả dữ liệu của bạn sạch sẽ - ai đó có thể vô hiệu hóa hoặc thả trình kích hoạt của bạn, nhập một số dữ liệu bẩn và kích hoạt lại hoặc tạo lại kích hoạt của bạn. Ngoài ra ai đó có thể trực tiếp sửa đổi bảng của bạn bỏ qua các thủ tục được lưu trữ.

Hãy để tôi trình bày cách thực hiện quy tắc kinh doanh này chỉ bằng các ràng buộc FK và CHECK - điều đó sẽ đảm bảo rằng tất cả dữ liệu thỏa mãn quy tắc kinh doanh miễn là tất cả các ràng buộc được tin cậy.

Tuy nhiên, một ví dụ khác là một cách để thực thi rằng các khoảng thời gian không có khoảng trống và không có sự chồng chéo .


1
"Tôi thường xuyên không chuẩn hóa để tôi có thể thực thi tính toàn vẹn dữ liệu với các ràng buộc." Tương tự ở đây. Đó là một sự đánh đổi tuyệt vời: Bạn không chuẩn hóa một chút nhưng đạt được DRI .
Nick Chammas

@NickChammas - điều này rất thú vị. Bạn có thể chia sẻ kịch bản khi bạn làm những việc như vậy?
AK

1
Chắc chắn rồi. Chúng tôi có một hệ thống Fulfillment bao gồm một hàng các mặt hàng sẽ được hoàn thành. Có một Fulfillablebảng với tất cả các chi tiết trên mỗi mục Fulfillable và sau đó có một FulfillableQueuebảng thực hiện hàng đợi trong SQL Server . Chỉ Fulfillables với một số nhất định StateIDcó thể được xếp hàng. StateIDtrong Fulfillablebảng, nhưng tôi sao chép nó FulfillableQueuevà sau đó thực thi ràng buộc này với FOREIGN KEYvà các CHECKràng buộc.
Nick Chammas
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.