Các ràng buộc toàn vẹn trong cơ sở dữ liệu quan hệ - chúng ta có nên bỏ qua chúng không?


10

Tôi đang thảo luận thường xuyên với các nhà phát triển của công ty nơi tôi làm việc vì họ nói rằng tốt hơn hết là loại bỏ việc thực thi mối quan hệ (thông qua các định nghĩa ràng buộc FOREIGN KEY) trong cơ sở dữ liệu quan hệ để tăng tốc các truy vấn lớn và để đạt được tốt hơn hiệu suất.

Nền tảng đang được xem xét là MySQL 5.x và không có FOREIGN KEY nào được thiết lập, thậm chí một số ràng buộc CHÍNH của các bảng có liên quan bị thiếu, ít nhất là đối với tôi, là không hợp lý. Có thể họ đúng và tôi sai, nhưng tôi không có đủ lý lẽ để thảo luận về tình huống này.

Đây là cách tiếp cận ưa thích trong ba năm nay. Tôi mới vào công ty này (chỉ một tháng), nhưng, vì sản phẩm của Google hoạt động, nên có sự do dự để nâng cao cơ sở dữ liệu; Neverthele, điều đầu tiên tôi nhận thấy là một trang mất 1 phút để tải (vâng, 60 giây!).

Một trong những tuyên bố đằng sau tình trạng hiện tại là cơ sở dữ liệu về sự không chuẩn hóa của người dùng nhanh hơn cơ sở dữ liệu bình thường hóa, nhưng tôi không tin đó là sự thật.

Hầu hết các truy vấn có liên quan bao gồm các hoạt động THAM GIA, khiến chúng chạy rất, rất, rất chậm với lượng dữ liệu lớn (cơ sở dữ liệu chứa hàng triệu hàng).

Thông thường, việc xử lý các hoạt động của CR CRUD được thực hiện ở cấp mã chương trình ứng dụng; ví dụ: để XÓA một số dữ liệu TỪ, giả sử TableA:

  • nó là cần thiết để kiểm tra đầu tiên một cách nhanh chóng nếu có một số mối quan hệ giữa các hàng của TableATableB,
  • trong trường hợp mối quan hệ được nói là đã được phát hiện ra, thì mã chương trình ứng dụng sẽ không cho phép XÓA (các) hàng thích hợp, nhưng
  • nếu vì một lý do nào đó, mã chương trình ứng dụng không thành công, thì thao tác XÓA sẽ thành công, nếu không có bất kỳ mối quan hệ nào liên quan đến các hàng và bảng liên quan.

Câu hỏi

Bạn có thể giúp tôi xây dựng một câu trả lời hay, chính xác và vững chắc để làm phong phú thêm cuộc tranh luận?


Lưu ý : Có thể một cái gì đó như thế này đã được hỏi (và trả lời) trước đây, nhưng tôi không thể tìm thấy bất cứ điều gì bằng Google.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


12

Nếu, như đã nêu trong bài đăng của bạn, ý định là tạo ra một cơ sở dữ liệu quan hệ (RDB cho ngắn gọn) và do đó, người ta hy vọng rằng nó hoạt động như vậy, câu trả lời ngắn gọn là:

  • Không, bạn không nên bỏ qua các ràng buộc toàn vẹn dữ liệu .

Mục tiêu chính phải là quản lý dữ liệu thích hợp vì nó là một tài sản tổ chức khá có giá trị và một cách đáng tin cậy để đạt được mục tiêu nói trên là sử dụng các phương tiện kỹ thuật được hỗ trợ trên lý thuyết âm thanh.

Do đó, là các chuyên gia cơ sở dữ liệu, bạn có thể tận dụng các cơ chế mô hình quan hệ hiện đại và thanh lịch do Tiến sĩ EF Codd cung cấp để thực thi các quy tắc kinh doanh và tránh các vấn đề cuối cùng sẽ phát sinh nếu chúng không được sử dụng.

Về mặt này, tôi sẽ chia sẻ (a) tổng thể của tôi về các ràng buộc và cũng (b) một số cân nhắc về tình trạng của cơ sở dữ liệu và môi trường làm việc có vấn đề như sau.

Ràng buộc FOREIGN KEY, mối quan hệ dữ liệu và tính toàn vẹn tham chiếu

RDB phải phản ánh các đặc điểm của bối cảnh kinh doanh với độ chính xác cao, điều này chắc chắn đòi hỏi một phân tích cấp độ khái niệm sâu sắc được dẫn dắt bởi một nhà mô hình hoặc nhà thiết kế tuân theo các thực tiễn tốt nhất, với sự hỗ trợ không thể thiếu của các chuyên gia kinh doanh. Phân tích đó phải mang lại sự xác định chính xác và xây dựng các quy tắc kinh doanh áp dụng .

Do đó, nếu một nhà lập mô hình như vậy đã xác định rằng có tồn tại mối tương quan giữa dữ liệu liên quan, họ phải cấu hình các hạn chế mức logic tương ứng để hệ thống quản lý cơ sở dữ liệu (DBMS) có thể đảm bảo rằng dữ liệu vẫn phù hợp với các đặc điểm chính xác và quy tắc xác định trong phân tích được đề cập ở trên mọi lúc .

Về cơ sở dữ liệu đang thảo luận, người ta có thể suy ra rằng mối quan hệ tương quan thích hợp đã được xác định, vì bạn đề cập rằng có một nỗ lực thủ tục (và dễ dàng phá vỡ) để thực thi chúng từ bên ngoài các cơ sở DBMS, bằng cách sử dụng mã chương trình ứng dụng (mà là một cách tiếp cận tiền quan hệ) mà trong mọi trường hợp, phải chạm vào cơ sở dữ liệu để cố gắng xác thực tính toàn vẹn của các mối quan hệ tương tác đã nói.

Tuy nhiên, như bạn đã biết, đó không phải là kỹ thuật tối ưu để bảo vệ tính toàn vẹn tham chiếu , bởi vì khoa học quan hệ đã quy định một công cụ rất mạnh cho mục đích này, tức là các ràng buộc FOREIGN KEY (FK). Những ràng buộc này rất dễ tạo ra (thông qua cách tiếp cận khai báo ưu việt) vì chúng là những câu đơn tránh sử dụng các thủ tục ad hoc không cần thiết và dễ bị lỗi. Rất hữu ích khi lưu ý rằng tốc độ thực thi của các ràng buộc FK đã được tối ưu hóa cao bởi các lập trình viên chuyên ngành (và các nhà cung cấp nền tảng chính đã làm việc với nó trong nhiều thập kỷ nay).

Hơn nữa, vì RDB phải là một thành phần phần mềm độc lập (tự bảo vệ, tự mô tả, v.v.) có khả năng được truy cập bởi nhiều chương trình ứng dụng (máy tính để bàn, tự động, web, di động, kết hợp của chúng), nên không nên Đã kết hợp với nhau với mã của bất kỳ ứng dụng nào.

Tương tự như vậy, dữ liệu xuất hiện trong một nguồn tài nguyên tổ chức quan trọng, tự nhiên có xu hướng vượt xa các chương trình ứng dụng, lập trình viên ứng dụng, nền tảng phát triển ứng dụng và mô hình lập trình.

Các ràng buộc chính PRIMARY và ý nghĩa của các hàng trùng lặp

Khi nói một cách dễ hiểu, một loại điều cụ thể đã được coi là có ý nghĩa trong môi trường kinh doanh, một người lập mô hình cơ sở dữ liệu phải (1) xác định các đặc điểm có liên quan của nó, Wapie, thuộc tính của nó, xác nhận loại điều đó như một nguyên mẫu thực thể - tức là, một loại thực thể và và (2) thể hiện nó bằng một bảng được tích hợp bởi một hoặc nhiều cột trong một thiết kế logic.

Sau đó, giống như điều tối quan trọng để phân biệt từng trường hợp riêng lẻ của một loại thực thể nhất định trong thế giới thực, mỗi hàng được bao trong một bảng cũng phải được phân biệt duy nhất. Nếu một bảng không có bất kỳ KEY nào được khai báo, cuối cùng nó sẽ giữ lại các bản sao và nếu có hai hoặc nhiều hàng giữ chính xác cùng một giá trị, thì tất cả chúng đều mang cùng một nghĩa , tất cả chúng đều đại diện cho cùng một thực tế .

Vào thời điểm đó, các hàng trùng lặp nên được loại bỏ do nhiều lý do. Từ góc độ lý thuyết, nhà thiết kế phải đảm bảo rằng mỗi hàng luôn là duy nhất cho mục đích có các bảng hoạt động tương tự như ngôn ngữ phụ dữ liệu SQL cho phép (có tác động quan trọng đối với các hoạt động thao tác dữ liệu). Ngoài ra, từ góc độ thông tin, nếu nhiều hàng đại diện cho cùng một thực tế, việc ghi âm của chúng không chỉ thừa mà còn có hại , như dưới đây được minh họa:

  • Giả sử rằng ai đó đã chèn hai hàng giống hệt nhau trong một bảng nhất định.
  • Sau đó, một người khác đến và chỉ cập nhật một lần xuất hiện của các bản sao. Kết quả là, sự xuất hiện khác không được cập nhật nữa.
  • Kế tiếp, một người khác cập nhật sự xuất hiện chưa được sửa đổi cho đến nay. Theo cách này, cả hai bản sao đã trải qua những thay đổi khác nhau tại các thời điểm khác nhau.
  • Sau đó, khi ai đó quan tâm đến việc chọn thông tin được truyền tải bởi các hàng trong câu hỏi, anh ấy hoặc cô ấy có thể tìm thấy hai phiên bản khác nhau.

Theo cách này:

  • Phiên bản nào có thể được coi là phiên bản chính xác, đáng tin cậy?
  • Cái nào phản ánh chính xác thế giới thực?

Như bạn đã biết, hiện tượng này thậm chí có thể có ý nghĩa pháp lý, một tình huống chắc chắn có tầm quan trọng rất lớn.

Bên cạnh đó, thời gian và nỗ lực phải được sử dụng để xử lý những mâu thuẫn đó (có lẽ thông qua một số loại đồng bộ hóa cập nhật khác của LINE) nên được dành cho các nhiệm vụ thực sự tạo ra giá trị cho tổ chức của bạn. Vì vậy, việc giữ lại các hàng mâu thuẫn phải được tránh bằng thiết kế để giữ nguyên tính nhất quán của cơ sở dữ liệu.

Đó là lý do tại sao việc xác định một PRIMARY KEY (PK) khai báo các ràng buộc tương ứng phải luôn được thực hiện bởi người thiết kế cơ sở dữ liệu. Nhưng cũng phải đề cập rằng một bảng có thể có nhiều hơn một cột hoặc tổ hợp các cột chứa các giá trị xác định duy nhất mỗi hàng; do đó, bên cạnh việc thiết lập ràng buộc PK (được thiết lập lý tưởng là CHÍNH vì lý do thực dụng), nhà thiết kế cũng phải khai báo một hoặc nhiều KHÓA THAY ĐỔI (thường được xác định thông qua một hoặc nhiều ràng buộc KHÔNG GIỚI HẠN) khi áp dụng (đó là khá phổ biến).

Một đặc tính thuận lợi khác của PK là, khi di chuyển vào các bảng khác để tham gia vào các FK đơn hoặc hỗn hợp, chúng có thể giúp thực thi các tỷ lệ chính của các mối quan hệ tồn tại giữa các dữ liệu. Tất cả điều này, vâng, bằng các cài đặt khai báo đơn giản và hiệu quả, được đảm bảo bởi DBMS.

(Hiện tại) KIỂM TRA ràng buộc và xác thực một hàng

Chúng ta đừng quên về sự liên quan của các ràng buộc KIỂM TRA (hiện tại), hạn chế khai báo bộ giá trị cột hợp lệ của một hàng (có vẻ đơn giản, nhưng thực tế là một tính năng cơ bản của DBMS quan hệ), cũng giúp thực hiện chắc chắn rằng các quy tắc của bối cảnh kinh doanh được phản ánh với độ chính xác mọi lúc.

Khi bạn đánh dấu câu hỏi của mình bằng thẻ MySQL, phải nói rằng, thật không may, một nền tảng như vậy cho phép tuyên bố loại ràng buộc nói trên, nhưng đồng thời, bỏ qua việc thực thi! , tình hình đó, có thể hiểu được, đã được báo cáo là một lỗi từ năm 2004 .

Về vấn đề này, bạn sẽ phải quan tâm đến yếu tố này bằng các phương tiện khác, ví dụ: GIAO DỊCH ACID , TRIGGERS hoặc các phương thức khác trong chính DBMS (xem câu trả lời này của @ ypercubeᵀᴹ để biết thông tin về chủ đề này) để dữ liệu tiếp tục hãy kiên định

Ràng buộc xác nhận: thiết lập thêm các quy tắc kinh doanh nhiều hàng và nhiều bảng

Một khía cạnh mà vì bất kỳ lý do gì đều hỗ trợ rất kém cho cácififif của các DBMS khác nhau, bao gồm cả MySQL, đang cho phép các ràng buộc nhiều hàng và nhiều bảng trong một PK và FK thời trang khai báo, rõ ràng là.

Về phần mình, tiêu chuẩn SQL bao gồm các CHỨNG NHẬN từ nhiều năm nay. Tôi không biết quy tắc nào trong môi trường kinh doanh của bạn sẽ được hưởng lợi từ cách tiếp cận xác thực mức logic đó, nhưng, với tư cách là người thiết kế cơ sở dữ liệu, tôi cho rằng sẽ rất tiện khi ràng buộc dữ liệu với một hoặc nhiều ĐÁNH GIÁ, mặc dù tôi phải đề cập đến điều đó từ quan điểm của các nhà phát triển DBMS, loại công cụ tối quan trọng này đã khó thực hiện ở mức độ trừu tượng hóa vật lý.

Dường như nhà cung cấp và / hoặc nhà phát triển của Oracle đang đánh giá hỗ trợ ASSERTION kể từ năm 2016 và điều đó sẽ khiến DBMS tuân thủ quan hệ hơn và do đó, mạnh mẽ và cạnh tranh hơn. Tôi đoán rằng, nếu (i) người tiêu dùng của họ tiếp tục thúc đẩy và (ii) Oracle thành công trong việc triển khai, thì (iii) các nhà cung cấp / cộng đồng DBMS khác cũng sẽ phải cho phép họ và việc sử dụng của họ sẽ bắt đầu lan rộng. Chắc chắn, đó sẽ là một tiến bộ lớn trong lĩnh vực quản lý cơ sở dữ liệu và là một trong những công cụ đặc biệt nhất được hình dung bởi Tiến sĩ Codd, cá nhân tôi hy vọng rằng chúng ta sẽ sớm thấy điều đó xảy ra.

Thống nhất dữ liệu và quá trình ra quyết định

Như đã thảo luận ở trên, một trong những khía cạnh quan trọng nhất của RDB là nó tự bảo đảm tính nhất quán của dữ liệu mà nó giữ lại và tính nhất quán chỉ được đáp ứng khi RDB tuân thủ các ràng buộc toàn vẹn được tuyên bố bởi nhà mô hình hóa.

Về mặt này, bắt buộc phải có các bảng cơ sở (những bảng được thiết lập trong cấu trúc DDL) mà tính toàn vẹn được bảo vệ để có thể tạo các bảng dẫn xuất (ví dụ: một câu lệnh CHỌN hoặc khung nhìn lấy các cột từ nhiều bảng) đáng tin cậy , bởi vì các bảng dẫn xuất phải được sản xuất nhất thiết theo các bảng cơ sở.

Người ta biết rằng mọi người sử dụng thông tin làm công cụ chính trong quá trình ra quyết định của tổ chức (và thông thường). Sau đó, nếu thông tin được trình bày bởi cơ sở dữ liệu không mạch lạc và chính xác, các quyết định dựa trên thông tin đó sẽ không có giá trị (để nói rằng ít nhất). Đó là lý do tại sao một RDB phải được thiết kế và triển khai cẩn thận: nó phải được xây dựng để trở thành một tài nguyên đáng tin cậy có thể hỗ trợ người dùng đưa ra các quyết định có căn cứ.

Chuẩn hóa

Than ôi, cơ sở dữ liệu 'không chuẩn hóa' nhanh hơn cơ sở dữ liệu bình thường hóa là một quan niệm sai lầm được lan truyền rộng rãi, mặc dù đó cũng là một lập luận có thể bác bỏ trên cơ sở logic, vật lý và thực dụng.

Thứ nhất, không chuẩn hóa ngụ ý rằng một bảng cơ sở đã được chuẩn hóa trước đó (nhờ quy trình chính thức , dựa trên cơ sở khoa học, được thực hiện ở mức độ trừu tượng logic của cơ sở dữ liệu).

Vì vậy, giả sử rằng bảng đã nói trên thực tế đã được chuẩn hóa một cách chính xác, thì việc không chuẩn hóa chính xác nó (điều này trái ngược với ý nghĩa chính thức của từ này, liên quan đến việc gắn vào các cột thuộc và cũng là một phần của các bảng khác trong quảng cáo thời trang hoc ) có thể hỗ trợ, ví dụ, để tăng tốc (ở cấp độ vật lý) việc xử lý chỉ một hoặc một vài câu lệnh CHỌN cụ thể, đồng thời, quá trình hành động đó có thể làm suy yếu việc thực thi nhiều dữ liệu liên quan khác các thao tác thao tác (ví dụ: một số câu lệnh INSERT, UPDATE, DELETE và SELECT hoặc các kết hợp của chúng được đính kèm trong một hoặc nhiều GIAO DỊCH ACID).

Ngoài ra, việc không chuẩn hóa (có thể là chính thức hoặc không chính thức) sẽ đưa ra các bất thường cập nhật / sửa đổi làm suy giảm sự gắn kết của cơ sở dữ liệu, một vấn đề mà điều đó có thể được xử lý bởi các thủ tục phức tạp, tốn kém và dễ bị lỗi, khi tất cả điều này có thể được ngăn chặn sự khởi đầu

Giàn giáo ở cấp độ vật lý hỗ trợ các bảng bình thường hóa và không chuẩn hóa

Bố cục logic (trừu tượng) (thiết kế SQL-DDL) có nghĩa là được sử dụng trong thế giới thực rõ ràng giữ các hậu quả vật lý (cụ thể) phải được xem xét.

Theo cách này, một bảng không được chuẩn hóa của Viking sẽ nhất thiết phải là rộng hơn (giữ các cột bổ sung), điều đó có nghĩa là các hàng của nó sẽ nặng hơn (yêu cầu các thành phần cấp vật lý lớn hơn và lớn hơn), do đó có nghĩa là các quy trình tính toán cơ bản (ví dụ , những thứ phải làm với ổ cứng hoặc bộ nhớ) có thể dễ dàng quay chậm hơn.

Ngược lại, một bảng được chuẩn hóa, tất nhiên, đó là phần tử hẹp hơn (có ít cột hơn) sẽ là một phần tử nhẹ hơn (được phục vụ bởi các thành phần vật lý nhỏ hơn và nhỏ hơn) mà hành xử nhanh hơn, giúp tăng tốc chuỗi các hành động liên quan đến , ví dụ, viết và đọc dữ liệu.

Do đó, rất thuận tiện để (a) bình thường hóa các bảng có liên quan một cách chính thức và thận trọng, giữ chúng như vậy, và sau đó (b) sử dụng bất kỳ tài nguyên cấp vật lý nào có thể tối ưu hóa tốc độ truy xuất và sửa đổi dữ liệu, ví dụ: một chiến lược lập chỉ mục cẩn thận và hiệu quả, cho phép cấu hình máy chủ phần mềm và phần cứng phù hợp, nâng cấp khả năng băng thông mạng, v.v.

Chức năng của cơ sở dữ liệu đang được xem xét

Các đoạn sau của câu hỏi của bạn phải làm với tốc độ của các hoạt động truy xuất dữ liệu:

[A] là sản phẩm mà thành công, có thể do dự, nâng cao cơ sở dữ liệu; tuy nhiên, điều đầu tiên tôi nhận thấy là một trang mất 1 phút để tải (vâng, 60 giây!).

Nếu tải của một trang nhất định mất nhiều như vậy, rõ ràng là người dùng hệ thống không nhận được dịch vụ tốt; do đó, ngay cả khi nó hoạt động, thì chức năng của nó dường như không tối ưu chút nào, điều đó chứng tỏ rằng ý định của bạn để làm cho toàn bộ môi trường (cơ sở dữ liệu và ứng dụng) hiệu quả hơn được duy trì tốt và thể hiện thái độ rất xây dựng.

Sau đó, ngay cả khi khoa học chắc chắn hỗ trợ bạn và do đó bạn nên duy trì một tư thế vững chắc, tôi khuyên bạn nên tiếp cận tình huống theo cách ngoại giao, vì vào cuối ngày, chủ nhân, đồng nghiệp và chính bạn đang THAM GIA nỗ lực để tạo ra toàn bộ tổ chức thành công hơn. Vì vậy, đó là một lập luận mà bạn nên nhấn mạnh, rằng, trong khi họ đang làm những việc khác tốt hơn, cải thiện thực tiễn quản lý dữ liệu chung và cụ thể có thể giúp đáng kể trong việc tạo ra sự tăng trưởng của tổ chức và cá nhân.

Hầu hết các truy vấn có liên quan bao gồm các hoạt động THAM GIA, khiến chúng chạy rất, rất, rất chậm với lượng dữ liệu lớn (cơ sở dữ liệu chứa hàng triệu hàng).

Điều đáng lưu ý là toán tử THAM GIA là một yếu tố thiết yếumạnh mẽ liên quan đến thao tác dữ liệu quan hệ. Sau đó, mặc dù các nền tảng mạnh hơn phục vụ nó với các thực thi tương đối nhanh hơn, hoàn cảnh bạn mô tả rất có thể là một triệu chứng của một thiết kế không hiệu quả (ở mức độ trừu tượng về mặt khái niệm, logic và vật lý). Vì vậy, ước tính tầm nhìn đầu tiên của tôi là:

  • Cài đặt INDEX có thể yêu cầu cải tiến.
  • Các định nghĩa về kích thước và loại cột PK và FK cần được xem xét (và tôi hoàn toàn đồng ý với @Rick James về các cân nhắc PK của anh ấy , vì các KEY tổng hợp có xu hướng hiệu quả hơn nhiều so với các đại diện được bổ sung trong các trường hợp thích hợp).
  • Chuẩn hóa hơn nữa (chính thức, dựa trên khoa học) có thể giúp giảm bớt những vấn đề này, vì thực tế là, trong trường hợp phù hợp (nghĩa là được thực hiện trong RDB được thiết kế tốt), THAM GIA được thực hiện rất nhanh .

Hơn nữa, vâng, như @TommCatt đề cập trong câu trả lời của anh ấy , đôi khi việc viết lại (logic) của một truy vấn sẽ sửa đổi kế hoạch thực hiện (vật lý) của nó để tăng tốc đọc / ghi dữ liệu, đây là một yếu tố cần được tính đến.


1
Câu trả lời chính xác. Tôi luôn nhắc nhở bản thân khi xem xét hiệu suất của việc triển khai rằng một nhóm các nhà phát triển thông minh hơn tôi đã làm việc với những vấn đề này trong một thời gian rất dài. Cơ sở dữ liệu quan hệ là trung tâm của các hệ thống khổng lồ nhất trên thế giới (Facebook và Twitter để đặt tên cho một vài cơ sở rõ ràng).
Nick Bedford

9

Tiền đề cơ bản của các nhà phát triển của bạn là hoàn toàn sai. Khóa ngoại sẽ ảnh hưởng một chút đến hiệu suất của DML trong hệ thống của bạn. Chúng hoàn toàn không được sử dụng trong các truy vấn do đó không ảnh hưởng đến hiệu suất của chúng. Vì vậy, các nhà phát triển của bạn không biết họ đang nói về điều gì và là những người cuối cùng bạn nên xem xét tư vấn.

Khóa ngoại đóng một vai trò quan trọng trong việc duy trì tính toàn vẹn của dữ liệu của bạn. Điều này quan trọng hơn nhiều so với bất kỳ cải tiến hiệu suất nhỏ nào có được bằng cách loại bỏ chúng (ngay cả điều đó là đúng).

Không, trong mọi trường hợp, loại bỏ FK khỏi cơ sở dữ liệu OLTP.

Ngoài ra, việc không chuẩn hóa đôi khi sẽ tăng tốc một số truy vấn. Nó, như họ nói, phụ thuộc. Tuy nhiên, ngay cả khi có một số cải tiến về tốc độ, nhìn chung vẫn không đáng để nỗ lực thêm để duy trì tính toàn vẹn dữ liệu.

Rất hiếm khi điều chỉnh đơn giản không thể giúp bạn cải thiện tốc độ nhiều hơn so với việc không chuẩn hóa. Đây là nơi mà một DBA giỏi có thể (cuối cùng) kiếm được tiền lương của anh ta. Bạn cũng có thể điều chỉnh các truy vấn của bạn. Có lần tôi đã lấy một truy vấn trả về câu trả lời trong không dưới 30 phút và khiến nó hoạt động trong vòng dưới 8 giây. Không có thay đổi đối với cơ sở dữ liệu, chỉ cần viết lại truy vấn. Cấp, đây là hồ sơ tốt nhất của cá nhân tôi, vì vậy số dặm của bạn có thể thay đổi, nhưng việc không chuẩn hóa sẽ là điều cuối cùng bạn thử.

Bạn cũng có thể muốn giữ cho các truy vấn phức tạp hơn được viết bởi các nhà phát triển. Hỏi họ xem dữ liệu nào họ muốn và ở định dạng nào họ muốn có. Sau đó cung cấp chế độ xem để cung cấp cho họ. Các truy vấn phức tạp sẽ là lượt xem. Các nhà phát triển sau đó chỉ phải viết:

select <something> from <SomeView> where <whatever>;

Tôi cũng giả sử cơ sở dữ liệu của bạn được thiết kế tốt. Một thiết kế kém của cơ sở dữ liệu, hoặc thậm chí các phần nhỏ của nó, có thể thực sự làm mọi thứ chậm lại. Tôi đã làm việc thường xuyên với các Bảng rất lớn (hàng tỷ bản ghi) với các truy vấn kết hợp chúng với nhau bên trái và bên phải và các câu trả lời mong đợi (và có) trong các phân số của một giây. Kích thước của bảng không xác định tốc độ của truy vấn.

Tôi thực sự co rúm người lại khi ai đó nói, "bởi vì sản phẩm 'hoạt động' nên có sự do dự để nâng cao cơ sở dữ liệu." Nếu "do dự" này giống như "không phải trên đồng hồ của tôi, bạn thân!" sau đó bạn thậm chí có thể muốn bắt đầu cập nhật sơ yếu lý lịch của bạn. Không có gì tốt từ một môi trường như vậy và bạn sẽ nhận được trách nhiệm cho mọi thất bại trong tương lai mặc dù bạn có thể đã vận động hàng giờ để thực hiện một thay đổi có thể ngăn chặn sự thất bại. Bạn sẽ nghe, "Bây giờ không phải là thời điểm tốt để thực hiện thay đổi" nhiều lần. Đúng. Chúc may mắn.


Một điều cần lưu ý là đôi khi bạn cần các truy vấn khác nhau cho cùng một dữ liệu dựa trên lượng dữ liệu được trả về. Ví dụ: một truy vấn đang trả về một hàng đơn (hoặc thậm chí chỉ là một số đếm) có thể được viết tốt hơn theo cách khác sau đó trả về hàng ngàn bản ghi.
Joe W

2

Thay đổi tiêu đề thay đổi câu hỏi. FOREIGN KEYslà tùy chọn. Họ làm:

  • Một FK ngầm tạo một INDEXtrong một trong các bảng. Một chỉ mục như vậy có thể được thêm bằng tay. (Vì vậy, FK không bắt buộc cho việc này.)
  • Một FK kiểm tra tính toàn vẹn. Đây là tuyên bố chính của FK để nổi tiếng. Không yêu cầu FK vì ứng dụng của bạn có thể thực hiện kiểm tra tương tự hoặc quyết định rằng không cần kiểm tra. Vì thế...
  • Kiểm tra tính toàn vẹn chi phí một cái gì đó trong hiệu suất; vì vậy nó làm chậm quá trình xử lý. (Đây thường không phải là một vấn đề lớn.)
  • FK không làm mọi thứ mà mọi người muốn; diễn đàn này tràn ngập các câu hỏi "tại sao FK không thể làm X". Cụ thể, CHECKtùy chọn không được thực hiện.
  • FK có thể CASCADEmọi thứ. (Cá nhân, tôi thích kiểm soát hơn và không cho rằng FK sẽ 'làm điều đúng đắn'.)

Điểm mấu chốt cho FK: Một số người nhấn mạnh vào FK; một số sản phẩm sống hoàn toàn tốt mà không có chúng. Bạn quyết định.

Loại bỏ PRIMARY KEYtrong InnoDB là một sai lầm lớn. Mặt khác, việc thoát khỏi một đại diện AUTO_INCREMENTvà sử dụng một "tự nhiên" PK tạo thành một (hoặc nhiều) cột thường là đúng điều cần làm. Một trường hợp đơn giản, phổ biến là rất nhiều: nhiều bảng ánh xạ, như được thảo luận ở đây .

Dựa trên kinh nghiệm cá nhân, tôi đề xuất mũ 2/3 bảng sẽ tốt hơn khi sử dụng 'tự nhiên' thay vì auto_inc PK.


1
Vì vậy, ... bạn dựa vào gần như một ứng dụng hoàn hảo bởi vì nếu một nhà phát triển mắc lỗi với một DELETEví dụ và bạn không bị hạn chế về phía DB, bạn sẽ kết thúc việc mất dữ liệu. Cách tiếp cận này hợp lệ nhưng yêu cầu mã mạnh và thử nghiệm tốt, điều mà họ không có :)
ReynierPM

Xóa quá nhiều có thể xảy ra trong ứng dụng hoặc với FK. Xóa quá ít thường trở nên rõ ràng. OTOH, tôi đã thấy các trường hợp Xóa quá ít đáng giá - hãy nghĩ đến một "bình thường hóa" nơi mọi thứ hiếm khi bị xóa. Các hàng thừa, không sử dụng, hầu như vô hại.
Rick James

Tôi đã thấy một trường hợp 'tốt' không có chỉ mục trên một bảng - một bảng phân tầng để ăn tốc độ cao. Nó rất thoáng qua (do đó không cần InnoDB) và chỉ cần đọc hoàn toàn (do đó, không cần chỉ mục).
Rick James

1
Lưu ý một chủ đề phổ biến trong lan man của tôi: Không có câu trả lời duy nhất; không có một kích cỡ phù hợp với tất cả.
Rick James

Nếu bảng của bạn là một ngàn hàng dài; hiệu suất không phải là một vấn đề. Nếu các bảng của bạn dài một tỷ hàng, tất cả "quy tắc" về chuẩn hóa, PK, chỉ mục, FK, UUID, v.v., cần phải được xem xét kỹ lưỡng. Khác db sẽ tan chảy.
Rick James
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.