2009-09-04 51 views
5

Khi lấy một cơ sở dữ liệu từ một hình thức tương đối không chuẩn hóa và bình thường hóa nó, nếu có, thay đổi trong việc sử dụng tài nguyên có thể mong đợi? Ví dụ, bình thường hóa thường có nghĩa là nhiều bảng được tạo ra từ ít hơn có nghĩa là cơ sở dữ liệu hiện có số lượng bảng cao hơn, nhưng nhiều bảng trong số đó là khá nhỏ, cho phép các bảng thường được sử dụng để phù hợp với bộ nhớ tốt hơn.Tác động tài nguyên từ việc chuẩn hóa một cơ sở dữ liệu là gì?

Số lượng bảng cao hơn cũng có nghĩa là cần có nhiều tham gia hơn để có được dữ liệu đã được trừu tượng hóa, vì vậy người ta sẽ mong đợi một số tác động từ số lượng gia nhập cao hơn mà hệ thống cần thực hiện.

Vì vậy, điều gì tác động đến việc sử dụng tài nguyên (ví dụ: điều gì sẽ thay đổi) bình thường hóa cơ sở dữ liệu không chuẩn hóa?


Chỉnh sửa: Để thêm một chút ngữ cảnh, tôi có sẵn cơ sở dữ liệu (cũ) với hơn 300 bảng khủng khiếp. Khoảng 1/2 dữ liệu là TEXT và nửa còn lại là các trường char hoặc số nguyên. Không có bất kỳ ràng buộc nào. Lý do tôi hỏi chủ yếu là để có thêm thông tin để thuyết phục người khác rằng mọi thứ cần phải thay đổi và sẽ không có sự sụt giảm về hiệu suất hoặc khả năng bảo trì. Thật không may, những người tôi phải thuyết phục biết chỉ đủ về lợi ích hiệu suất của một cơ sở dữ liệu không chuẩn hóa để tránh bình thường hóa càng nhiều càng tốt.

+1

phụ thuộc rất nhiều vào không gian, tùy thuộc vào loại dữ liệu bạn có thể thấy dung lượng bộ nhớ đi xuống hoặc đi lên. –

+1

Có một bài đăng thực sự hay về chủ đề này trong http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive – GmonC

+0

@GmonC - Vâng, đó là một bài đăng tuyệt vời nhưng tôi muốn để biết cách sử dụng tài nguyên sẽ * thay đổi * từ một unnormalized thành một phiên bản chuẩn hóa của cùng một cơ sở dữ liệu. – cdeszaq

Trả lời

13

Điều này có thể không thực sự được trả lời một cách tổng quát, vì tác động sẽ thay đổi nặng tùy thuộc vào chi tiết cụ thể của cơ sở dữ liệu được đề cập và ứng dụng sử dụng nó.

Vì vậy, về cơ bản bạn nói những kỳ vọng chung liên quan đến tác động:

  1. nhu cầu bộ nhớ chung cho việc lưu trữ nên đi xuống, dữ liệu như dư thừa được loại bỏ
  2. CPU cần thể đi lên, như truy vấn sức trở nên đắt hơn (Lưu ý rằng trong nhiều trường hợp, truy vấn trên cơ sở dữ liệu chuẩn hóa sẽ nhanh hơn, ngay cả khi chúng phức tạp hơn, vì có nhiều tùy chọn tối ưu hơn cho công cụ truy vấn)
  3. Phát triển resourc e cần thể đi lên, như các nhà phát triển thể cần phải xây dựng các truy vấn phức tạp hơn (Nhưng mặt khác, bạn cần nỗ lực phát triển ít hơn để duy trì tính toàn vẹn dữ liệu)

Vì vậy, câu trả lời duy nhất là thông thường : nó phụ thuộc;)

Lưu ý: Điều này giả định rằng chúng tôi đang nói về việc thận trọng và cố ý không chuẩn hóa. Nếu bạn đang đề cập đến 'chỉ ném một số bảng với nhau như dữ liệu đến cùng' cách tiếp cận cách để chung với các nhà phát triển thiếu kinh nghiệm, tôi muốn có nguy cơ tuyên bố rằng bình thường sẽ làm giảm nhu cầu tài nguyên trên tất cả các cấp;)


Edit: về bối cảnh cụ thể bổ sung bằng cách cdeszaq, tôi muốn nói 'Chúc may mắn nhận được điểm của bạn thông qua';)

Oviously, với hơn 300 Bàn không hạn chế(), câu trả lời cho câu hỏi của bạn là! chắc chắn 'bình thường hóa sẽ giảm nhu cầu tài nguyên trên tất cả các cấp' (và có lẽ rất đáng kể), nhưng:

Tái cấu trúc một mớ hỗn độn như vậy sẽ là cam kết chính. Nếu chỉ có một ứng dụng sử dụng cơ sở dữ liệu này, nó đã rất đáng sợ - nếu có nhiều, nó có thể trở thành cơn ác mộng!

Vì vậy, ngay cả khi bình thường hóa đáng kể sẽ giảm nhu cầu tài nguyên trong thời gian dài, thì có thể không đáng để khắc phục sự cố, tùy thuộc vào hoàn cảnh. Các câu hỏi chính ở đây là về phạm vi dài hạn - cơ sở dữ liệu này quan trọng như thế nào, nó sẽ được sử dụng trong bao lâu, sẽ có nhiều ứng dụng sử dụng nó trong tương lai, là nỗ lực bảo trì hiện tại không ngừng hoặc tăng ... vn ...

Đừng bỏ qua rằng nó là một hệ thống chạy - thậm chí nếu nó xấu xí và khủng khiếp, theo mô tả của bạn nó không phải là (chưa) bị phá vỡ ;-)

1

Đối với một điều, bạn sẽ phải thực hiện các phép tính kết quả. Ví dụ, nếu bạn có một Blog, với một số Post s, bạn có thể hoặc là làm:

select count(*) from Post where BlogID = @BlogID 

mà đắt hơn

select PostCount from Blog where ID = @BlogID 

và có thể dẫn đến các vấn đề SELECT N+1, nếu bạn 'không cẩn thận.

Tất nhiên với tùy chọn thứ hai bạn phải đối phó với việc giữ nguyên toàn vẹn dữ liệu, nhưng nếu tùy chọn đầu tiên đủ đau đớn, thì bạn làm cho nó hoạt động.

Cẩn thận bạn không bị lỗi premature optimisation. Làm điều đó trong thời trang chuẩn hóa, sau đó đo lường hiệu suất chống lại các yêu cầu, và chỉ khi nó rơi ngắn, bạn nên nhìn vào denormalise.

3

Có một câu trả lời rất đơn giản cho câu hỏi của bạn: nó phụ thuộc. Trước hết, tôi muốn tái cụm từ câu hỏi của bạn là 'lợi ích của việc không chuẩn hóa' là gì, bởi vì bình thường hóa là một cái gì đó nên được thực hiện như một mặc định (như là kết quả của một mô hình logic thuần túy) và sau đó không chuẩn hóa được áp dụng cho các bảng rất cụ thể trong đó hiệu suất là rất quan trọng. Vấn đề chính của việc không chuẩn hóa là nó có thể làm phức tạp quản lý dữ liệu toàn vẹn, nhưng lợi ích trong một số trường hợp lớn hơn những rủi ro.

Lời khuyên của tôi về không chuẩn hóa: chỉ thực hiện khi nó thực sự đau và đảm bảo bạn có tất cả các tình huống được đề cập đến để duy trì tính toàn vẹn dữ liệu sau khi chèn, cập nhật hoặc xóa.

+0

Điều này tương tự như lời khuyên mà tôi đã nghe và có xu hướng đồng ý, bây giờ tôi có một số kinh nghiệm trong vành đai của tôi - "Bình thường hóa cho đến khi nó đau hiệu suất, và không còn nữa." – David

2

tôi đã phát hiện ra rằng bình thường, trong một số trường hợp, sẽ cải thiện hiệu suất.

Bàn nhỏ đọc nhanh hơn. Một cơ sở dữ liệu không chuẩn hóa sẽ thường có (a) hàng dài hơn và (b) hàng nhiều hơn một thiết kế chuẩn hóa.

Đọc các hàng ngắn hơn có nghĩa là ít I/O vật lý hơn.

2

Để nhấn mạnh một số điểm được áp dụng bởi các áp phích trước: Bạn có thực sự không chuẩn hóa lược đồ hiện tại không?Cách thích hợp (IMHO) để thiết kế một cơ sở dữ liệu là:

  • Hiểu một cách tốt nhất bạn có thể hệ thống/thông tin để được mô hình
  • Xây dựng một đầy đủ mô hình bình thường
  • Sau đó, nếu và khi bạn thấy nó cần thiết, denormalize trong một kiểm soát thời trang để nâng cao hiệu suất

(có thể có lý do khác để denormalize, nhưng những người duy nhất tôi có thể nghĩ ra khỏi tay là những chính trị - có để khớp với mã hiện tại, nhà phát triển/người quản lý không thích nó, v.v.)

Điểm của tôi là, nếu bạn chưa bao giờ chuẩn hóa hoàn toàn, bạn không có cơ sở dữ liệu chuẩn hóa, bạn đã có unnormalized một. Và tôi nghĩ bạn có thể nghĩ nhiều hơn về mô tả nếu các thuật ngữ ít lịch sự hơn cho những cơ sở dữ liệu đó.

+0

Tôi thực sự có thể nghĩ về tên khác cho cơ sở dữ liệu này, và có, nó là một cơ sở dữ liệu * unnormalized *, như bạn nói. Cảm ơn bạn đã làm rõ. – cdeszaq

1

Các lược đồ chuẩn hóa có xu hướng hoạt động tốt hơn cho INSERT/UPDATE/DELETE vì không có "bất thường cập nhật" và các thay đổi thực tế cần được thực hiện được bản địa hóa hơn.

CHỌN được trộn lẫn. Việc không chuẩn hóa là thực hiện một cách tham gia. Không có nghi ngờ rằng materializing một tham gia đôi khi giúp, tuy nhiên, materialization thường rất bi quan (có lẽ thường xuyên hơn không), do đó, không giả định rằng denormalization sẽ giúp bạn. Ngoài ra, các lược đồ chuẩn hóa thường nhỏ hơn và do đó có thể yêu cầu ít I/O hơn. Việc tham gia không nhất thiết phải tốn kém, do đó, không tự động giả định rằng nó sẽ được.

4

"Bình thường hóa" áp dụng chỉ và độc quyền đến logic thiết kế của một cơ sở dữ liệu.

Thiết kế logic của cơ sở dữ liệu và thiết kế vật lý của cơ sở dữ liệu là hai hoàn toàn riêng biệt điều. Lý thuyết cơ sở dữ liệu luôn có ý định cho mọi thứ theo cách này. Thực tế là các nhà phát triển bỏ qua/bỏ qua sự khác biệt này (từ sự thiếu hiểu biết hoặc bất cẩn hoặc ra khỏi sự lười biếng hoặc bất cứ cái gì khác gọi là "lý do") là đại đa số, không làm cho họ đúng.

A Thiết kế hợp lý có thể được cho là được chuẩn hóa hay không, nhưng thiết kế lôgic không mang bất kỳ "đặc tính hiệu suất" nào. Cũng giống như 'c: = c + 1;' không thực hiện bất kỳ đặc tính hiệu suất nào.

A thiết kế vật lý xác định "đặc tính hiệu suất", nhưng sau đó lại thiết kế vật lý đơn giản không có chất lượng "được chuẩn hóa hay không".

Nhận thức sai lầm này về "hiệu quả làm tổn thương bình thường" thực sự không có gì khác ngoài chứng minh cụ thể rằng tất cả các công cụ DBMS tồn tại ngày nay chỉ thiếu nghiêm trọng trong các tùy chọn thiết kế vật lý.

1

Tôi muốn xây dựng trên Henrik Opel's #3 bullet point. Chi phí phát triển có thể tăng lên, nhưng họ không phải làm như vậy. Trong thực tế, việc bình thường hóa cơ sở dữ liệu sẽ đơn giản hóa hoặc cho phép sử dụng các công cụ như ORM, Trình tạo mã, Trình viết báo cáo, vv Các công cụ này có thể giảm đáng kể thời gian trên lớp truy cập dữ liệu của các ứng dụng của bạn. giá trị.

Bạn có thể tìm thấy một cuộc thảo luận StackOverflow tốt here về khía cạnh phát triển của cơ sở dữ liệu được chuẩn hóa. Có rất nhiều câu trả lời hay, ý kiến ​​và những điều cần suy nghĩ.

Các vấn đề liên quan