Trước hết, cơ sở dữ liệu quan hệ (lý do tồn tại) của cơ sở dữ liệu quan hệ là có thể mô hình hóa mối quan hệ giữa các thực thể. Tham gia chỉ đơn giản là cơ chế mà chúng tôi vượt qua các mối quan hệ đó. Chúng chắc chắn đi kèm với chi phí danh nghĩa, nhưng không có liên kết, thực sự không có lý do gì để có một cơ sở dữ liệu quan hệ.
Trong thế giới học thuật, chúng ta học về những thứ như các dạng thông thường khác nhau (1, 2, 3, Boyce-Codd, v.v.), và chúng ta tìm hiểu về các loại khóa khác nhau (chính, ngoại, thay thế, duy nhất, v.v.) và cách những thứ này phù hợp với nhau để thiết kế một cơ sở dữ liệu. Và chúng tôi tìm hiểu những điều thô sơ của SQL cũng như thao tác với cả cấu trúc và dữ liệu (DDL & DML).
Trong thế giới doanh nghiệp, nhiều cấu trúc học thuật hóa ra kém khả thi hơn đáng kể so với những gì chúng ta từng tin tưởng. Một ví dụ hoàn hảo là khái niệm về khóa chính. Về mặt học thuật, đó là thuộc tính (hoặc tập hợp các thuộc tính) xác định duy nhất một hàng trong bảng. Vì vậy, trong nhiều lĩnh vực vấn đề, khóa chính học thuật thích hợp là tổ hợp của 3 hoặc 4 thuộc tính. Tuy nhiên, hầu hết mọi người trong thế giới doanh nghiệp hiện đại đều sử dụng số nguyên tuần tự, được tạo tự động làm khóa chính của bảng. Tại sao? Hai lý do. Thứ nhất là vì nó làm cho mô hình sạch hơn nhiều khi bạn di chuyển FK khắp nơi. Điều thứ hai, và cũng là sai lầm nhất cho câu hỏi này, đó là việc truy xuất dữ liệu thông qua các phép nối nhanh hơn và hiệu quả hơn trên một số nguyên duy nhất so với trên 4 cột varchar (như đã được đề cập bởi một số người).
Bây giờ chúng ta hãy tìm hiểu sâu hơn một chút về hai loại phụ cụ thể của cơ sở dữ liệu thế giới thực. Loại đầu tiên là cơ sở dữ liệu giao dịch. Đây là cơ sở cho nhiều ứng dụng thương mại điện tử hoặc quản lý nội dung thúc đẩy các trang web hiện đại. Với DB giao dịch, bạn đang tối ưu hóa rất nhiều cho "thông lượng giao dịch". Hầu hết các ứng dụng thương mại hoặc nội dung phải cân bằng hiệu suất truy vấn (từ các bảng nhất định) với hiệu suất chèn (trong các bảng khác), mặc dù mỗi ứng dụng sẽ có các vấn đề kinh doanh riêng cần giải quyết.
Loại thứ hai của cơ sở dữ liệu thế giới thực là cơ sở dữ liệu báo cáo. Chúng hầu như chỉ được sử dụng để tổng hợp dữ liệu kinh doanh và tạo các báo cáo kinh doanh có ý nghĩa. Chúng thường có hình dạng khác với cơ sở dữ liệu giao dịch nơi dữ liệu được tạo và chúng được tối ưu hóa cao cho tốc độ tải dữ liệu hàng loạt (ETL) và hiệu suất truy vấn với các tập dữ liệu lớn hoặc phức tạp.
Trong mỗi trường hợp, nhà phát triển hoặc DBA cần cân bằng cẩn thận cả đường cong chức năng và hiệu suất, và có rất nhiều thủ thuật nâng cao hiệu suất cho cả hai phía của phương trình. Trong Oracle, bạn có thể thực hiện cái được gọi là "giải thích kế hoạch" để bạn có thể thấy cụ thể cách một truy vấn được phân tích cú pháp và thực thi. Bạn đang tìm cách tối đa hóa việc sử dụng hợp lý các chỉ mục của DB. Một điều thực sự khó chịu là đặt một hàm trong mệnh đề where của một truy vấn. Bất cứ khi nào bạn làm điều đó, bạn đảm bảo rằng Oracle sẽ không sử dụng bất kỳ chỉ mục nào trên cột cụ thể đó và bạn có thể sẽ thấy bản quét toàn bộ hoặc một phần bảng trong kế hoạch giải thích. Đó chỉ là một ví dụ cụ thể về cách một truy vấn có thể được viết mà kết thúc là chậm và nó không liên quan gì đến các phép nối.
Và trong khi chúng ta đang nói về quét bảng, chúng rõ ràng tác động đến tốc độ truy vấn tỷ lệ thuận với kích thước của bảng. Việc quét toàn bộ bảng gồm 100 hàng thậm chí không đáng chú ý. Chạy cùng một truy vấn đó trên một bảng có 100 triệu hàng và bạn sẽ cần phải quay lại vào tuần tới để trả lại.
Hãy nói về bình thường hóa trong một phút. Đây là một chủ đề học thuật phần lớn tích cực khác có thể khiến bạn quá căng thẳng. Hầu hết khi chúng ta nói về chuẩn hóa, chúng ta thực sự muốn nói đến việc loại bỏ dữ liệu trùng lặp bằng cách đưa nó vào bảng của chính nó và di chuyển một FK. Những người thường bỏ qua toàn bộ điều phụ thuộc được mô tả bởi 2NF và 3NF. Và trong một trường hợp cực đoan, chắc chắn có thể có một cơ sở dữ liệu BCNF hoàn hảo, khổng lồ và là một con thú hoàn chỉnh để viết mã vì nó quá bình thường.
Vậy chúng ta cân bằng ở đâu? Không có câu trả lời tốt nhất. Tất cả các câu trả lời tốt hơn có xu hướng thỏa hiệp giữa việc dễ bảo trì cấu trúc, dễ bảo trì dữ liệu và dễ tạo / bảo trì mã. Nói chung, càng ít trùng lặp dữ liệu càng tốt.
Vậy tại sao tham gia đôi khi bị chậm? Đôi khi đó là thiết kế quan hệ tồi. Đôi khi, việc lập chỉ mục không hiệu quả. Đôi khi đó là vấn đề về khối lượng dữ liệu. Đôi khi đó là một truy vấn được viết khủng khiếp.
Xin lỗi vì một câu trả lời dài dòng như vậy, nhưng tôi cảm thấy bắt buộc phải cung cấp bối cảnh về thịt xung quanh nhận xét của mình hơn là chỉ nói lảm nhảm một câu trả lời 4 gạch đầu dòng.