Tôi phải đề cập đến các vấn đề với DRY trong thế giới cơ sở dữ liệu quan hệ. Cơ sở dữ liệu được thiết kế để thực hiện nhanh chóng và tốt bằng cách sử dụng logic dựa trên tập hợp và thông qua các truy vấn có thể mở rộng. Các nguyên tắc DRY thường khiến nhà phát triển viết các truy vấn không thể Sargable hoặc sử dụng logic Row-by-agonizing-Row để tận dụng mã hiện có trong nhiều tình huống. DRY và tối ưu hóa hiệu suất thường mâu thuẫn và trong thế giới cơ sở dữ liệu, hiệu suất thường quan trọng hơn nhiều so với bảo trì. Điều này không có nghĩa là bạn hoàn toàn không nên sử dụng các nguyên tắc DRY, chỉ là bạn nên biết cách nó sẽ ảnh hưởng đến khả năng sử dụng chung của cơ sở dữ liệu. Nhà phát triển ứng dụng điều DRY trước và hiệu suất thứ hai, nhà phát triển cơ sở dữ liệu nghĩ rằng toàn vẹn dữ liệu trước, hiệu suất thứ hai, bảo mật dữ liệu thứ ba (hiệu suất và bảo mật có thể hoán đổi vị trí trong một số hệ thống).
Nói chung, tôi nhận thấy rằng càng nhiều lớp trừu tượng bạn đưa vào truy vấn cơ sở dữ liệu thì chúng càng trở nên chậm hơn. Tôi không nói rằng tôi không muốn những người tự thiết kế các chương trình cơ sở dữ liệu không làm tốt hơn việc cho phép các nhà phát triển sử dụng DRY mà không ảnh hưởng đến việc cơ sở dữ liệu hoạt động tốt như thế nào, nhưng tôi không thiết kế phần mềm cơ sở dữ liệu ở mức đó , vì vậy có lẽ mâu thuẫn giữa trừu tượng và hiệu năng trong cơ sở dữ liệu khó khắc phục hơn tôi cho là. Tuy nhiên, chúng tôi phải làm việc với các hệ thống vì chúng hiện đang được xây dựng. Chúng tôi có thể yêu cầu thực hiện tốt hơn các nguyên tắc DRY trong các bản phát hành trong tương lai sẽ không làm giảm hiệu suất (và nó đã trở nên tốt hơn qua nhiều năm nhưng vẫn có vấn đề), nhưng trong khi đó, chúng tôi phải xem xét liệu DRY có phải là bước đi đúng đắn cho cơ sở dữ liệu này không tại thời điểm này.
Nhưng thường thì các tính năng mà bạn muốn sử dụng để đảm bảo nguyên tắc DRY được đáp ứng là những tính năng gây ra vấn đề rất lớn cho cơ sở dữ liệu. Tôi không nói không bao giờ sử dụng DRY nhưng đừng quá nhiệt tình với nó.
Ví dụ về những gì tôi đang nói về. Bạn cần thực hiện nhập dữ liệu của một triệu bản ghi mỗi tháng một lần. Bản ghi có thể được thêm thủ công thông qua giao diện người dùng gọi một Proc được lưu trữ. Proc này, bởi vì nó được thiết kế cho nhập khẩu bản ghi duy nhất, chỉ thêm một bản ghi tại một thời điểm. Sử dụng DRY để tránh có mã chèn ở hai vị trí, bạn viết một con trỏ để gọi Proc liên tục thay vì viết các nhập khẩu dựa trên tập hợp mà bạn cần. Thời gian để nhập từ 30 phút sẽ sử dụng logic dựa trên thiết lập đến 18 giờ. Bây giờ cách đúng đắn để tuân thủ DRY trong trường hợp này sẽ là sửa lỗi Proc để xử lý nhập khẩu bản ghi mulitple. Thật không may, thường không thể hoặc rất khó để gửi một mảng đến một Proc (tùy thuộc vào phần cuối của db) và bằng cách thay đổi Proc, cuối cùng bạn sẽ phá vỡ ứng dụng.
Các hàm vô hướng và các hàm có giá trị bảng cũng được sử dụng để thực hiện các nguyên tắc DRY và một lần nữa chúng có thể ảnh hưởng nghiêm trọng đến hiệu suất, đặc biệt nếu bạn cần sử dụng chúng theo cách ngăn các chỉ mục trở nên hữu ích.
Lượt xem cũng tốt cho việc thực hiện DRY. Tuy nhiên, nếu bạn triển khai DRY thông qua việc sử dụng các chế độ xem gọi các chế độ xem gọi các chế độ xem khác, bạn sẽ nhanh chóng đi đến điểm mà các truy vấn sẽ hết thời gian tải. Trong thực tế, bạn có thể cần phải tạo ra bộ dữ liệu của hàng triệu bản ghi khi bạn chỉ cần ba cái ở cuối. Vì vậy, chế độ xem một cấp của một tập hợp phức tạp để triển khai DRY có thể rất tuyệt vời (tôi có một bản thân mà chúng tôi sử dụng để đảm bảo tất cả báo cáo tài chính sử dụng cùng một bảng cơ sở và tính toán của một số điều nhất định), hơn hai cấp và bạn cần xem xét nếu bạn đang tạo ra một mớ hỗn độn hiệu suất.