Thực thi toàn vẹn cơ sở dữ liệu


19

Điều này có bao giờ có ý nghĩa khi ứng dụng thực thi toàn vẹn cơ sở dữ liệu thay vì có khóa ngoại, kiểm tra các ràng buộc, v.v.?

Bao nhiêu cải thiện hiệu suất mà người ta có thể mong đợi để không thực thi tính toàn vẹn của cơ sở dữ liệu thông qua các công cụ cơ sở dữ liệu nội bộ?

Câu trả lời:


24

Sự thật mà nói, không những bạn sẽ không thấy mất hiệu năng nhiều khi có các ràng buộc khóa ngoại trong cơ sở dữ liệu, mà bạn sẽ thấy các cải tiến hiệu suất. Trình tối ưu hóa truy vấn SQL Server được xây dựng dựa trên khái niệm về khóa chính và khóa trước cũng như các loại ràng buộc dữ liệu khác. Nếu những điều này được đặt ra và được thực thi, trình tối ưu hóa có thể tận dụng lợi thế của chúng để giúp bạn có hiệu suất tốt hơn. Đây là một bài đăng blog với một ví dụ đơn giản cho thấy nó hoạt động.

Nếu bạn đang ở trong trường hợp cạnh mà bạn thực sự có nhiều phần chèn hơn số lần đọc (và các bản cập nhật & xóa yêu cầu đọc, vì vậy chúng thường kết thúc việc thêm vào số lần đọc), thì có thể có ý nghĩa để loại bỏ các ràng buộc khỏi dữ liệu về hiệu suất, có thể . Nhưng vì phần lớn các cơ sở dữ liệu được định hướng đọc, bạn đang hy sinh hiệu năng, không tăng cường nó.

Và không ai trong số này đề cập đến thực tế là tính toàn vẹn dữ liệu được xử lý tốt hơn tại cơ sở dữ liệu vì bạn chỉ phải tạo một lần khi bạn làm tất cả các công việc trong mã, bạn có thể phải thực hiện nhiều lần cho nhiều ứng dụng (trừ khi bạn thiết kế lớp truy cập dữ liệu của bạn một cách cẩn thận và yêu cầu mọi ứng dụng truy cập db để đi qua cùng lớp đó).

Nếu bạn đang sử dụng một hệ thống cơ sở dữ liệu quan hệ, tôi nói, tại sao không thực sự sử dụng nó. Nếu bạn không cần dữ liệu quan hệ, hãy đi với Hadoop hoặc một cái gì đó khác.


2
Đó là khá nhiều dọc theo những gì tôi nghĩ bản thân và mong đợi. Tôi biết rằng DBA tại công việc trước đây của tôi đã sai về nó, chỉ muốn có một ý kiến ​​độc lập về nó. Cảm ơn!
Đổi mới Stozkov

17

Rất nhiều nhà phát triển ứng dụng nghĩ như vậy.

Khi bạn muốn ủy thác tính toàn vẹn dữ liệu cho mã ứng dụng, hãy nghĩ rằng "Mọi lập trình viên và mọi ứng dụng truy cập cơ sở dữ liệu này từ giờ cho đến hết thời gian đều phải làm cho nó hoàn toàn đúng, mọi lúc".

Tỷ lệ cược là gì?


5
+1. Đó là cơ bản là nó. Bạn thay thế một hệ thống trung tâm và được thử nghiệm tốt với hàng tấn lập trình viên phải tuân thủ. Mỗi lần. Sẽ không xảy ra - vì bạn có cơ sở dữ liệu với dữ liệu xấu theo thời gian.
TomTom

13

Ngay cả khi có bất kỳ hiệu suất nào, nó vẫn không đáng kể so với sự trở lại của tính toàn vẹn tham chiếu và tính toàn vẹn dữ liệu tổng quát.

Lâu rồi là những ngày mà cơ sở dữ liệu là một kho dữ liệu câm. Tận dụng sức mạnh mà RDBMS 'cung cấp.

Hiệu suất đạt được không phải là tất cả, đặc biệt là ở quy mô nhỏ như vậy. Nhưng khi bạn phát hiện ra bạn có mối quan hệ khóa ngoại được cho là ứng dụng của bạn phải thi hành và hóa ra đó không phải là khóa chính trong bảng tham chiếu thì bạn sẽ quan tâm rất ít đến việc tăng hiệu suất (nếu có, tôi có thể 't nói về các chi tiết cụ thể về điều đó).


-1. Lâu rồi là những ngày mọi người đưa logic ứng dụng vào cơ sở dữ liệu, phần khó nhất và tốn kém nhất để mở rộng một phần của toàn bộ ngăn xếp - đối với tôi cơ sở dữ liệu là một kho lưu trữ với logic được chạy bởi các ứng dụng. RATNG SAID: Tính toàn vẹn tham chiếu là về tính toàn vẹn của cơ sở dữ liệu và rất hữu ích.
TomTom

5
@TomTom Viết lại logic toàn vẹn dữ liệu trong ứng dụng của bạn đang làm lại công việc đã được thực hiện trong RDBMSes. Giữ logic dữ liệu trong cơ sở dữ liệu.
Thomas Stringer

@TomTom - "Dữ liệu không hợp lệ về mặt lý thuyết không bao giờ đánh vào cơ sở dữ liệu, nhưng tính toàn vẹn là hàng phòng thủ cuối cùng." Đã đồng ý. Hình thức AJAX lạ mắt đó sẽ giúp người dùng cuối của bạn đỡ đau đầu bằng cách xác thực trả trước đầu vào của họ. Tương tự như vậy, những hạn chế cơ sở dữ liệu đó sẽ tiết kiệm cho doanh nghiệp của bạn và các kỹ sư của bạn nhiều thời gian, tiền bạc và năng lượng bị mất sau khi làm xấu mã .
Nick Chammas

6

Đó là cách phổ biến để loại bỏ các ràng buộc (khóa ngoại, KIỂM TRA, v.v.) và lập chỉ mục nếu bạn đang thực hiện tải dữ liệu đủ lớn và bật lại / thực hiện các ràng buộc & chỉ mục sau đó. Xác nhận đó có một chi phí thời gian. Đó là giả sử bạn không thể sử dụng cú pháp tải hàng loạt cụ thể của cơ sở dữ liệu (bao gồm giảm thiểu ghi nhật ký).

Không thể nói mức tăng hiệu suất mong đợi - mỗi tình huống là duy nhất (kiểu dữ liệu, thiết kế, v.v.). Cách duy nhất để thực sự biết là kiểm tra.


1
+1. Tuy nhiên, xin lưu ý rằng đây là trường hợp đặc biệt - nói chung, các laod dữ liệu không thực hiện bất kỳ xử lý nào và cho rằng dữ liệu là chính xác và dù sao cũng sẽ thổi vào bước chỉ mục tạo lại. Đây là một kỹ thuật cấp dữ liệu.
TomTom

3

Có một vài lần khi các ràng buộc cản trở:

  1. Khi bạn cần sử dụng Kế thừa bảng đơn (STI). Hãy tưởng tượng bạn bán cho cả cá nhân và tổ chức. Bạn sẽ cần một bảng "Bên" duy nhất có hàng là cá nhân hoặc tổ chức. STI có nghĩa là bạn cần một số trường nullable không nên null. Kế thừa bảng lớp giải quyết điều này, nhưng điều này khó hơn đối với một số ORM. Ví dụ như ActiveRecord của Ruby chỉ hỗ trợ STI.

  2. Khi bạn cần hỗ trợ các phiên bản Dự thảo của một thực thể, điều đó có thể không hoàn toàn hợp lệ. Bạn có thể lưu trữ một bản nháp dưới dạng json, nhưng sau đó, việc sử dụng lại cùng một mã định danh trên máy khách sẽ khó hơn - hãy tưởng tượng nó đã được lưu với id = 5, được chỉnh sửa thành không hợp lệ và được tự động lưu là bản nháp = 99. Trong trường hợp này, tất cả các lĩnh vực của bạn có thể phải là null.

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.