Người dùng Aaron Bertrand đã đưa ra một số ý kiến phù hợp với suy nghĩ của tôi về câu hỏi của bạn. Đây là một thách thức khung hơn là một câu trả lời cho câu hỏi cụ thể của bạn, nhưng tôi nghĩ rằng nó có giá trị để xem xét trong bối cảnh này.
Tính di động là một mục tiêu sách giáo khoa tốt, nhưng nó hiếm khi xảy ra trong thực tế.
Nếu bạn phải thay đổi nền tảng tại một số điểm, sẽ có những thay đổi cần thiết cho ứng dụng, cơ sở dữ liệu và có thể nhiều thứ khác. Nếu bạn có thể hơi "bất khả tri" mà không cần quá nhiều nỗ lực, thì tốt thôi. Nhưng đó thực sự là một quyết định kinh doanh tồi khi sử dụng nó làm mục tiêu thiết kế.
Có nhiều nơi trực tuyến nơi mọi người thảo luận về nhược điểm hoặc lập trình theo cách này, đây là một trong số đó tôi thấy khá hấp dẫn:
Các lớp trừu tượng cơ sở dữ liệu phải chết!
The Fallacy Fallacy
Tác giả sử dụng một đối số mà tôi nghe thấy mọi lúc: Nếu bạn sử dụng một lớp trừu tượng tốt, bạn sẽ dễ dàng chuyển từ $ this_database sang $ other_database trên đường.
Thật vớ vẩn. Nó không bao giờ dễ dàng.
Trong bất kỳ ứng dụng hỗ trợ cơ sở dữ liệu không tầm thường nào, không ai nghĩ chuyển đổi cơ sở dữ liệu là một vấn đề dễ dàng. Nghĩ rằng "việc chuyển đổi sẽ không đau đớn" là một tưởng tượng.
Các kỹ sư giỏi cố gắng chọn các công cụ tốt nhất cho công việc và sau đó làm mọi thứ có thể để tận dụng các tính năng mạnh mẽ và độc đáo nhất của công cụ của họ. Trong thế giới cơ sở dữ liệu, điều đó có nghĩa là gợi ý cụ thể, lập chỉ mục, kiểu dữ liệu và thậm chí cả các quyết định cấu trúc bảng. Nếu bạn thực sự giới hạn bản thân trong tập hợp các tính năng phổ biến trên tất cả các RDBMS chính, thì bạn đang tự làm cho mình và khách hàng của mình một sự bất đồng lớn.
Điều đó không khác gì khi nói "Tôi đang giới hạn bản thân mình trong tập hợp con của PHP giống với Perl và C, bởi vì tôi có thể muốn chuyển đổi ngôn ngữ một ngày và 'không đau' chuyển mã của tôi."
Điều đó không xảy ra.
Chi phí chuyển đổi cơ sở dữ liệu sau khi một ứng dụng được phát triển và triển khai là khá cao. Bạn có thể thay đổi lược đồ và chỉ mục, thay đổi cú pháp, tối ưu hóa và điều chỉnh công việc để làm lại, gợi ý để điều chỉnh hoặc loại bỏ, v.v. Thay đổi mysql_foo () thành oracle_foo () thực sự là vấn đề ít nhất của bạn. Bạn sẽ chạm vào hầu hết, nếu không phải tất cả, về SQL của bạn - hoặc ít nhất bạn sẽ cần xác minh nó.
Điều đó không có vẻ "không đau" đối với tôi.
<>
) và không chuẩn (!=
), khi không có sự thỏa hiệp về hiệu suất hoặc khả năng bảo trì, tôi luôn chọn tiêu chuẩn. Nhưng khi nói đến các chi phí khác, hoặc không có tiêu chuẩn tương đương, tôi khai thác và sở hữu độc quyền. Những thứ bạn từ bỏ chỉ để có khả năng chuyển đổi hoàn toàn nền tảng bán buôn chỉ là không đáng.