Tại sao không yêu SQL? [đóng cửa]


116

Gần đây tôi đã nghe nói rất nhiều về SQL là một ngôn ngữ khủng khiếp, và có vẻ như mọi khuôn khổ dưới ánh mặt trời đều được đóng gói sẵn với một lớp trừu tượng cơ sở dữ liệu.

Theo kinh nghiệm của tôi, SQL thường là cách dễ dàng hơn, linh hoạt hơn và thân thiện hơn với lập trình viên để quản lý đầu vào và đầu ra dữ liệu. Mọi lớp trừu tượng mà tôi đã sử dụng dường như là một cách tiếp cận hạn chế rõ rệt mà không có lợi ích thực sự.

Điều gì làm cho SQL trở nên khủng khiếp và tại sao các lớp trừu tượng cơ sở dữ liệu lại có giá trị?


11
những gì về loại an toàn?
johnny 29/10/09

3
Chính xác thì những lớp trừu tượng này được nhắm mục tiêu đến ai? SQL không phải là một ngôn ngữ mà mọi người đều giỏi, và vì vậy chúng có thể nhắm đến những lập trình viên tầm thường. Bản thân SQL hoàn toàn không phải là một ngôn ngữ tốt cho những người không phải là lập trình viên.
David Thornley

27
@ David: Định nghĩa một ngôn ngữ (máy tính) "tốt cho người không phải là lập trình viên". Những người không phải là lập trình viên, IMHO, nên tránh xa các ngôn ngữ lập trình (và theo nghĩa rộng hơn của từ này, SQL).
DevSolar

15
tất cả các câu trả lời cũng nên được wiki. Thật là điên rồ khi những câu hỏi và câu trả lời như thế này nhận được rất nhiều phiếu bầu. Tôi nghĩ đây là một diễn đàn kỹ thuật? bạn có thể giải quyết vấn đề của ai đó bằng cách cung cấp một số đoạn mã khó viết và nhận được một hoặc hai phiếu bầu, nhưng hãy trả lời một câu hỏi như thế này và nhận được vô số phiếu bầu. Điều đó thực sự khập khiễng nếu bạn hỏi tôi.
KM.

6
@KM: Vấn đề với các phiếu bầu là chúng phụ thuộc nhiều vào số lượng người đọc câu trả lời. Tôi đã trả lời nhiều câu hỏi NHibernate và Rhino Mocks mà cần một thời gian để trả lời chính xác - và được chấp nhận nhưng không một phiếu bầu nào. Nếu bạn trả lời một điều gì đó tầm thường về C #, bạn sẽ nhận được hàng tá phiếu bầu. Phiếu bầu không công bằng. Đề xuất điều gì đó trên meta.stckoverflow, nếu bạn biết bất cứ điều gì tốt hơn.
Stefan Steinegger

Câu trả lời:


132

Điều này một phần là chủ quan. Vì vậy, đây là ý kiến ​​của tôi:

SQL có kiểu ngôn ngữ giả tự nhiên . Các nhà phát minh tin rằng họ có thể tạo ra một ngôn ngữ giống như tiếng Anh và các truy vấn cơ sở dữ liệu sẽ rất đơn giản. Một sai lầm khủng khiếp. SQL rất khó hiểu ngoại trừ những trường hợp nhỏ nhặt.

SQL là khai báo. Bạn không thể nói cho cơ sở dữ liệu biết nó sẽ làm công việc như thế nào , chỉ là kết quả bạn muốn. Điều này sẽ hoàn hảo và rất mạnh mẽ - nếu bạn không phải quan tâm đến hiệu suất. Vì vậy, bạn kết thúc bằng việc viết SQL - đọc các kế hoạch thực thi - diễn đạt lại SQL cố gắng tác động đến kế hoạch thực thi, và bạn tự hỏi tại sao bạn không thể tự viết kế hoạch thực thi .

Một vấn đề khác của ngôn ngữ khai báo là một số vấn đề dễ giải quyết hơn theo cách mệnh lệnh. Vì vậy, bạn có thể viết nó bằng một ngôn ngữ khác (bạn sẽ cần SQL tiêu chuẩn và có thể là một lớp truy cập dữ liệu) hoặc bằng cách sử dụng các phần mở rộng ngôn ngữ cụ thể của nhà cung cấp, chẳng hạn như bằng cách viết các thủ tục được lưu trữ và tương tự. Làm như vậy, bạn có thể sẽ thấy rằng bạn đang sử dụng một trong những ngôn ngữ tồi tệ nhất mà bạn từng thấy - bởi vì nó chưa bao giờ được thiết kế để sử dụng như một ngôn ngữ mệnh lệnh.

SQL rất cũ . SQL đã được chuẩn hóa, nhưng quá muộn, nhiều nhà cung cấp đã phát triển phần mở rộng ngôn ngữ của họ. Vì vậy, SQL kết thúc bằng hàng chục phương ngữ. Đó là lý do tại sao các ứng dụng không có tính di động và một lý do để có một lớp trừu tượng DB.

Nhưng đó là sự thật - không có lựa chọn thay thế khả thi nào. Vì vậy, tất cả chúng ta sẽ sử dụng SQL trong vài năm tới.


31
"Chỉ cần nêu những gì bạn muốn - chúng tôi giao hàng càng sớm càng tốt". Cách tiếp cận khai báo đó thật tuyệt vời và nó thực sự hiện đại (nghĩ LINQ). Đúng là đôi khi bạn cần phải điều chỉnh để tăng tốc độ và một giải pháp thay thế thủ tục cho SQL có thể hữu ích khi đó. Nhưng tôi vẫn sử dụng SQL khai báo hầu hết thời gian vì sự đơn giản.
MarkJ

4
MarkJ: Tôi nhớ rằng tôi đã sắp xếp lại các mệnh đề WHERE để tối ưu hóa các truy vấn trong oracle. Họ giải quyết từ dưới lên trên ... khủng khiếp.
Stefan Steinegger

16
Tôi hoàn toàn đồng ý. Dân IT có niềm đam mê với các công cụ phi thủ tục. Sẽ không dễ dàng hơn nhiều nếu bạn chỉ cho máy tính biết bạn muốn gì và nó sẽ tìm ra cách thực hiện! Vâng, nếu máy tính thực sự đủ thông minh để làm điều đó. Nhưng nó không phải. Tôi muốn điều đó nếu tôi có thể nói với chiếc xe của mình "Đưa tôi đến chỗ bà ngoại" và nó sẽ đưa tôi đến đó. Nhưng nó không phải vậy, vì vậy tôi không chỉ buông tay lái và giả vờ rằng điều này sẽ hiệu quả. Có thể một ngày nào đó công nghệ sẽ xuất hiện, hoặc có thể đó là một giấc mơ không tưởng. Nhưng nó không có ngày hôm nay. (còn tiếp ...)
Jay

12
Touché. Câu trả lời của bạn mô tả hoàn hảo những thất vọng ban đầu của tôi với SQL. Tôi đã viết rất nhiều mã thủ tục vì tôi không tin tưởng SQL để tạo ra một kế hoạch thực thi hiệu quả. Khi tôi trở nên thông thạo hơn trong SQL, tôi phát hiện ra rằng nó thực sự khá tốt trong việc tối ưu hóa và SQL được viết đúng cách thường chạy nhanh hơn mã thủ tục của tôi.
Kluge

5
@Jay và những người nghi ngờ SQL khác. Theo kinh nghiệm của tôi, vấn đề là để sử dụng SQL một cách hiệu quả, bạn cần phải có khả năng suy nghĩ theo bộ chứ không phải theo thủ tục - đó chính xác là cách mà hầu hết các lập trình viên được dạy phải suy nghĩ. Sử dụng SQL một cách hiệu quả thực sự không quá khó và nằm trong tầm tay của bất kỳ lập trình viên có năng lực nào (như bất kỳ ai đọc SO!) Nhưng cần phải nỗ lực để chuyển sang suy nghĩ theo logic dựa trên bộ và phần lớn thời gian mọi người không 'không bận tâm (và tôi hiện đang sửa đổi một chương trình mà người lập trình ban đầu đã thực hiện mọi thứ bằng cách sử dụng con trỏ vì lý do chính xác này)
Cruachan

58

Ngoài tất cả những gì đã nói, một công nghệ không cần phải tệ để làm cho một lớp trừu tượng có giá trị .

Nếu bạn đang thực hiện một tập lệnh hoặc ứng dụng rất đơn giản, bạn có thể đủ khả năng kết hợp các lệnh gọi SQL trong mã của mình ở bất cứ đâu bạn muốn. Tuy nhiên, nếu bạn đang thực hiện một hệ thống phức tạp, thì việc cô lập các lệnh gọi cơ sở dữ liệu trong (các) mô-đun riêng biệt là một phương pháp hay và vì vậy nó đang cô lập mã SQL của bạn. Nó cải thiện khả năng đọc, khả năng bảo trì và khả năng kiểm tra của mã của bạn. Nó cho phép bạn nhanh chóng điều chỉnh hệ thống của mình với những thay đổi trong mô hình cơ sở dữ liệu mà không cần chia nhỏ tất cả những thứ cấp cao, v.v.

SQL là tuyệt vời. Các lớp trừu tượng trên nó làm cho nó thậm chí còn lớn hơn!


6
Rất ngoại giao! (Và sự thật, để khởi động!)
Joseph Ferris

2
Vấn đề là sự nghịch đảo trừu tượng. SQL trong cơ sở dữ liệu quan hệ là một môi trường khai báo dựa trên tập hợp. Nó có mức độ trừu tượng cao hơn so với lập trình mệnh lệnh, hướng đối tượng hoặc không.
Steven Huwig

2
Có thể như vậy, Steven, nhưng về mặt ứng dụng, nó thực hiện một chức năng ở mức thấp (ngay cả khi nó thực hiện nó theo cách cực kỳ cao). Bất kể bạn thực hiện những biến đổi điên rồ nào ở cấp độ cơ sở dữ liệu, thì cuối cùng, nó vẫn là một người bắt đầu và thiết lập được tôn vinh. Hoặc bạn có thể nhìn nhận nó theo cách ngược lại, đó là mức độ quá cao không thể trộn lẫn với ứng dụng và phải được tách riêng và xem xét riêng. Trong mọi trường hợp, việc giữ SQL bên ngoài mã ứng dụng chính có những lợi ích rất hữu hình về khả năng đọc và cấu trúc lại.
Bỏ qua

53

Một điểm của các lớp trừu tượng là thực tế là các triển khai SQL có xu hướng ít nhiều không tương thích với nhau vì tiêu chuẩn hơi mơ hồ, và cũng bởi vì hầu hết các nhà cung cấp đã thêm phần bổ sung (không chuẩn) của riêng họ vào đó. Tức là, SQL được viết cho MySQL DB có thể không hoạt động hoàn toàn tương tự với Oracle DB - ngay cả khi nó "nên".

Tuy nhiên, tôi đồng ý rằng SQL tốt hơn hầu hết các lớp trừu tượng ngoài kia. Không phải lỗi của SQL mà nó được sử dụng cho những thứ mà nó không được thiết kế cho.


19
Tôi không hiểu làm thế nào mà sự không tương thích phương ngữ SQL lại có thể là một "điểm" lớn như vậy đối với SQL. Điều đó giống như nói C là tào lao vì bạn không thể chỉ biên dịch + chạy cùng một nguồn trong các bản phân phối Linux khác nhau. Nếu, và đó là một IF lớn, công ty của bạn quyết định chuyển đổi nhà cung cấp cơ sở dữ liệu, thì đó là một trường hợp hiếm và lớn có nhiều phần chuyển động hơn là chỉ viết lại một số SQL.
Jeff Meatball Yang

7
Nó không phải là một điểm chống lại SQL, nó là một điểm cho các lớp trừu tượng. Giống như, bạn không thể chỉ biên dịch + chạy cùng một mã C ở bất cứ đâu, đó là một điểm cho các ngôn ngữ không quan tâm đến nền tảng hơn. Nhưng nó không làm cho SQL và C trở nên "tào lao": dù sao thì các lớp trừu tượng chạy trên cùng của các lớp sâu hơn.
Joonas Pulakka

8
@Jeff: Trong C, các tác vụ thông thường là một phần của tiêu chuẩn. Trong SQL, không thể phân trang một tập hợp kết quả mà không truy cập vào SQL cụ thể của nhà cung cấp.
Powerlord

4
Ồ, và về sự hiếm hoi của việc chuyển đổi nhà cung cấp cơ sở dữ liệu: bạn đang nói về điều gì? Sự hiếm hoi của một công ty chuyển đổi hệ điều hành có làm cho các giải pháp đa nền tảng không liên quan không? Không phải lúc nào bạn cũng biết trước sản phẩm của mình sẽ được chạy trên nền tảng gì, vì vậy tốt hơn hết bạn nên tìm đến các giải pháp chung chung hơn.
Joonas Pulakka

3
@Joonas: Tôi đoán tôi muốn nói rằng (các) ngôn ngữ SQL không phải là vấn đề - Câu hỏi đặt ra rằng điều gì khiến SQL trở nên khủng khiếp và phản ứng ban đầu của tôi, giống như của bạn, là không phải vậy. Nhưng tôi muốn tranh luận rằng việc điều chỉnh các phương ngữ khác nhau không thực sự là điểm của ORM - chúng tôi sẽ có chúng ngay cả khi chúng tôi chỉ có một ngôn ngữ chuẩn - tôi nghĩ rằng chúng ta cần một cách để giải quyết dữ liệu chuẩn hóa thành mô hình OO.
Jeff Meatball Yang

36

SQL bị badmouthed từ một số nguồn:

  • Các lập trình viên không cảm thấy thoải mái với bất cứ thứ gì ngoại trừ một ngôn ngữ mệnh lệnh.
  • Các chuyên gia tư vấn phải xử lý nhiều sản phẩm dựa trên SQL không tương thích hàng ngày
  • Các nhà cung cấp cơ sở dữ liệu quan hệ đang cố gắng phá vỡ sự bó buộc của các nhà cung cấp cơ sở dữ liệu quan hệ trên thị trường
  • Các chuyên gia cơ sở dữ liệu quan hệ như Chris Date, những người xem việc triển khai SQL hiện tại là không đủ

Nếu bạn gắn bó với một sản phẩm DBMS, thì tôi chắc chắn đồng ý rằng SQL DBs linh hoạt hơn và có chất lượng cao hơn so với đối thủ của chúng, ít nhất là cho đến khi bạn chạm vào rào cản khả năng mở rộng nội tại trong mô hình. Nhưng bạn thực sự đang cố gắng viết Twitter tiếp theo hay bạn chỉ đang cố gắng giữ cho một số dữ liệu kế toán có tổ chức và nhất quán?

Chỉ trích SQL thường là đại diện cho những lời chỉ trích về RDBMS. Điều mà những người chỉ trích RDBMSes dường như không hiểu là chúng giải quyết khá tốt một loại vấn đề máy tính khổng lồ, và chúng ở đây để làm cho cuộc sống của chúng ta dễ dàng hơn chứ không phải khó khăn hơn.

Nếu họ nghiêm túc về việc chỉ trích chính SQL, họ sẽ ủng hộ những nỗ lực như Hướng dẫn D và Dataphor.


7
Về điểm đầu tiên về việc các lập trình viên không được thoải mái với bất cứ thứ gì ngoài một ngôn ngữ mệnh lệnh. Sẽ rất thú vị trong vài năm tới để xem liệu sự hồi sinh của lập trình chức năng có tạo ra sự khác biệt nào cho điều này hay không. Hiện tại, có rất nhiều sự cường điệu về các ngôn ngữ như Haskell, F # và Scala khiến các nhà phát triển trở nên hiệu quả hơn nhiều. Kiểu tư duy “toán học” này đối với các lập trình viên rất giống với kiến ​​thức về đại số quan hệ và phép tính quan hệ tuple mà SQL giả định trước. Có thể sẽ có sự hồi sinh của tư duy dựa trên bộ SQL nguyên bản trong thời gian!
Trevor Tippins

Tôi nên làm rõ rằng tôi muốn nói rằng "những lập trình viên không cảm thấy thoải mái với bất cứ điều gì ngoài lập trình bắt buộc," không phải là tất cả các lập trình viên không thoải mái với nó.
Steven Huwig

+1, nói tốt. Và với tư cách là một người đã dành vài năm đầu tiên ở đó với tư cách là một lập trình viên chuyên nghiệp trong cơ sở dữ liệu tiền quan hệ, tôi thấy thật tuyệt rằng bất cứ ai cũng muốn quay trở lại thời đại đó ngoại trừ những nhiệm vụ chuyên biệt. Một ngày dành để viết mã duyệt qua cấu trúc DL / 1 cây là đủ để thuyết phục bất kỳ ai.
Cruachan

Rắc rối là có nhiều lập trình viên ép buộc, những người thà viết ra vài trăm dòng mã vô vị hơn là nghĩ về mọi thứ trong một giờ hoặc lâu hơn.
Steven Huwig

Bạn không cần phải suy nghĩ về mọi thứ trong một giờ để viết hoặc hiểu một vài dòng mã. Giai đoạn = Stage.
Andrew

23

Nó không quá khủng khiếp. Đó là một xu hướng đáng tiếc trong ngành này khi loại bỏ công nghệ đáng tin cậy trước đây khi một "mô hình" mới xuất hiện. Vào cuối ngày, các khung công tác này rất có thể sử dụng SQL để giao tiếp với cơ sở dữ liệu, vậy làm sao nó có thể tệ như vậy? Điều đó nói rằng, có một lớp trừu tượng "tiêu chuẩn" có nghĩa là một nhà phát triển có thể tập trung vào mã ứng dụng chứ không phải mã SQL. Nếu không có một lớp tiêu chuẩn như vậy, bạn có thể viết một lớp nhẹ mỗi khi bạn đang phát triển một hệ thống, điều này thật lãng phí công sức.


16

SQL được thiết kế để quản lý và truy vấn dữ liệu dựa trên SET. Nó thường được sử dụng để làm nhiều hơn và các trường hợp cạnh tranh đôi khi dẫn đến sự thất vọng.

Việc sử dụng SQL trong thực tế có thể bị ảnh hưởng bởi thiết kế cơ sở dữ liệu cơ sở mà SQL có thể không phải là vấn đề, nhưng thiết kế có thể xảy ra - và khi bạn tung mã kế thừa được liên kết với một thiết kế xấu, các thay đổi sẽ ảnh hưởng hơn và tốn kém hơn ( không ai thích quay lại và "sửa chữa" những thứ đang "hoạt động" và đạt được mục tiêu)

Thợ mộc có thể đập đinh bằng búa, cưa gỗ bằng cưa và làm nhẵn ván bằng máy bào. Có thể "cưa" bằng cách sử dụng búa và máy bay, nhưng nó thật bực bội.


11

Tôi sẽ không nói nó khủng khiếp. Nó không phù hợp cho một số nhiệm vụ. Ví dụ: bạn không thể viết mã thủ tục tốt với SQL. Tôi đã từng bị buộc phải làm việc với thao tác thiết lập với SQL. Tôi đã mất cả cuối tuần để tìm ra điều đó.

SQL được thiết kế cho đại số quan hệ - đó là nơi nó nên được sử dụng.


2
Điều đáng tiếc là bạn chỉ cần dán một số mã thủ tục đơn giản vào một thủ tục được lưu trữ sẽ rất hấp dẫn. Và nó hoạt động tốt. ĐẾN ai đó cần phải duy trì nó / thêm một số trường hợp ngoại lệ, vv ...
Brian Knoblauch

5
-1, ờ đó chính xác là vấn đề, SQL được thiết kế để dựa trên thiết lập và đó là sức mạnh của nó. Suy nghĩ theo thủ tục nghĩa là bạn đang nghĩ sai.
Cruachan

1
Cái tuốc nơ vít này thật tệ! Thật khó để đóng móng tay với nó.
Casey Rodarmor,

9

Gần đây tôi đã nghe nói rất nhiều về SQL là một ngôn ngữ khủng khiếp, và có vẻ như mọi khuôn khổ dưới ánh mặt trời đều được đóng gói sẵn với một lớp trừu tượng cơ sở dữ liệu.

Lưu ý rằng các lớp này chỉ chuyển đổi nội dung của riêng chúng thành SQL. Đối với hầu hết các nhà cung cấp cơ sở dữ liệu SQLlà cách duy nhất để giao tiếp với động cơ.

Theo kinh nghiệm của tôi, SQL thường là cách dễ dàng hơn, linh hoạt hơn và thân thiện hơn với lập trình viên để quản lý đầu vào và đầu ra dữ liệu. Mọi lớp trừu tượng mà tôi đã sử dụng dường như là một cách tiếp cận hạn chế rõ rệt mà không có lợi ích thực sự.

… Lý do mà tôi vừa mô tả ở trên.

Các lớp cơ sở dữ liệu không thêm bất cứ thứ gì, chúng chỉ giới hạn bạn. Chúng làm cho các truy vấn trở nên đơn giản hơn nhưng không bao giờ hiệu quả hơn.

Theo định nghĩa, không có gì trong các lớp cơ sở dữ liệu mà không có trong đó SQL.

Điều gì làm cho nó trở SQLnên khủng khiếp và tại sao các lớp trừu tượng cơ sở dữ liệu lại có giá trị?

SQL là một ngôn ngữ hay, tuy nhiên, để làm việc với nó cần phải có một số thao tác não bộ.

Về lý thuyết, SQLlà khai báo, tức là bạn khai báo những gì bạn muốn nhận được và động cơ cung cấp nó theo cách nhanh nhất có thể.

Trong thực tế, có nhiều cách để hình thành một truy vấn đúng (đó là truy vấn trả về kết quả chính xác).

Các nhà tối ưu hóa có thể xây dựng một lâu đài Lego từ một số thuật toán được xác định trước (vâng, chúng là nhiều), nhưng họ không thể tạo ra các thuật toán mới. Nó vẫn cần một SQLnhà phát triển để hỗ trợ họ.

Tuy nhiên, một số người mong đợi trình tối ưu hóa tạo ra "kế hoạch tốt nhất có thể", không phải "kế hoạch tốt nhất có sẵn cho truy vấn này với việc triển khai SQLcông cụ nhất định".

Và như chúng ta đều biết, khi chương trình máy tính không đáp ứng được mong đợi của mọi người, thì đó là chương trình bị đổ lỗi chứ không phải mong đợi.

Tuy nhiên, trong hầu hết các trường hợp, việc định dạng lại một truy vấn có thể tạo ra một kế hoạch tốt nhất có thể. Tuy nhiên, có những nhiệm vụ khi nó không thể thực hiện được, với những cải tiến mới và ngày càng tăng cho SQLnhững trường hợp này, số lượng ngày càng ít đi.

Tuy nhiên, sẽ rất tuyệt nếu các nhà cung cấp cung cấp một số quyền truy cập cấp thấp vào các chức năng như "lấy phạm vi chỉ mục", "lấy một hàng theo rowid" v.v., chẳng hạn như các Ctrình biên dịch cho phép bạn nhúng hợp ngữ ngay vào ngôn ngữ.

Gần đây tôi đã viết một bài báo về điều này trên blog của tôi:


7

Tôi là một người ủng hộ ORM rất lớn và tôi vẫn tin rằng SQL rất hữu ích, mặc dù chắc chắn có thể làm những điều khủng khiếp với nó (giống như bất kỳ thứ gì khác). .

Tôi xem SQL như một ngôn ngữ siêu hiệu quả không có ưu tiên sử dụng lại mã hoặc khả năng bảo trì / tái cấu trúc.

Vì vậy, xử lý nhanh như chớp là ưu tiên. Và điều đó có thể chấp nhận được. Bạn chỉ cần nhận thức được sự đánh đổi, đối với tôi là đáng kể.

Từ quan điểm thẩm mỹ, với tư cách là một ngôn ngữ, tôi cảm thấy rằng nó thiếu một số thứ vì nó không có các khái niệm OO, v.v. - nó giống như một mã thủ tục rất cũ đối với tôi. Nhưng đó là cách nhanh nhất để làm một số việc nhất định và đó là một thị trường ngách mạnh mẽ!


7

Tôi muốn nói rằng một lớp trừu tượng cơ sở dữ liệu được bao gồm trong một khuôn khổ là một điều tốt vì nó giải quyết được hai vấn đề rất quan trọng:

  1. Nó giữ cho mã khác biệt. Bằng cách đặt SQL vào một lớp khác, lớp này thường rất mỏng và chỉ nên thực hiện những điều cơ bản về truy vấn và chuyển giao kết quả (theo cách chuẩn hóa), bạn giữ cho ứng dụng của mình không bị mớ bòng bong của SQL. Đó cũng là lý do các nhà phát triển web (nên) đặt CSS và Javascript trong các tệp riêng biệt. Nếu bạn có thể tránh nó, đừng trộn lẫn ngôn ngữ của bạn .

  2. Nhiều lập trình viên chỉ sử dụng SQL rất tệ. Vì bất cứ lý do gì, một số lượng lớn các nhà phát triển (đặc biệt là các nhà phát triển web) dường như rất rất rất kém trong việc sử dụng SQL hoặc RDBMSes nói chung. Họ coi cơ sở dữ liệu (và SQL bằng phần mở rộng) như một người trung gian nhỏ bé mà họ phải trải qua để truy cập dữ liệu. Điều này dẫn đến cơ sở dữ liệu được suy nghĩ cực kỳ tồi tệ không có chỉ mục, các bảng xếp chồng lên nhau trong cách cư xử không rõ ràng và các truy vấn được viết rất kém. Hoặc tệ hơn, họ cố gắng quá chung chung (Hệ thống chuyên gia, bất kỳ ai?) Và không thể liên hệ dữ liệu một cách hợp lý theo bất kỳ cách nào có ý nghĩa.

Thật không may, đôi khi cách mà ai đó cố gắng giải quyết vấn đề và các công cụ mà họ sử dụng, cho dù do thiếu hiểu biết, bướng bỉnh hay một số đặc điểm khác, lại đối lập trực tiếp với nhau, và chúc may mắn khi cố gắng thuyết phục họ về điều này. Như vậy, ngoài việc là một thực tiễn tốt, tôi coi lớp trừu tượng cơ sở dữ liệu là một loại mạng lưới an toàn, vì nó không chỉ giữ cho SQL khỏi con mắt của nhà phát triển kém, mà còn làm cho mã của họ dễ dàng cấu trúc lại hơn, vì tất cả các truy vấn đều ở một nơi.


6

SQL là tuyệt vời cho một số loại tác vụ, đặc biệt là thao tác và truy xuất các tập dữ liệu.

Tuy nhiên, SQL thiếu (hoặc chỉ triển khai một phần) một số công cụ quan trọng để quản lý sự thay đổi và phức tạp:

  • Tính đóng gói : Các cơ chế đóng gói của SQL là thô. Khi bạn viết mã SQL, bạn phải biết mọi thứ về việc triển khai dữ liệu của mình. Điều này giới hạn số lượng trừu tượng bạn có thể đạt được.

  • Tính đa hình : nếu bạn muốn thực hiện cùng một thao tác trên các bảng khác nhau, bạn phải viết mã hai lần. (Người ta có thể giảm thiểu điều này bằng cách sử dụng các khung nhìn theo trí tưởng tượng.)

  • Kiểm soát khả năng hiển thị : không có cơ chế SQL tiêu chuẩn nào để ẩn các đoạn mã với nhau hoặc nhóm chúng thành các đơn vị logic, vì vậy mọi bảng, thủ tục, v.v. đều có thể truy cập từ mọi bảng khác, ngay cả khi nó không mong muốn.

  • Mô-đun và tạo phiên bản

Cuối cùng, mã hóa thủ công các hoạt động CRUD trong SQL (và viết mã để kết nối nó với phần còn lại của ứng dụng) là lặp đi lặp lại và dễ xảy ra lỗi.

Một lớp trừu tượng hiện đại cung cấp tất cả các tính năng đó và cho phép chúng ta sử dụng SQL ở nơi nó hiệu quả nhất trong khi ẩn các chi tiết triển khai lặp đi lặp lại, gián đoạn. Nó cung cấp các công cụ để giúp khắc phục sự không phù hợp trở kháng quan hệ đối tượng gây phức tạp cho việc truy cập dữ liệu trong phát triển phần mềm hướng đối tượng.


Điều gì về lược đồ để kiểm soát khả năng hiển thị?
Ba giá trị Logic

5

SQL dựa trên Lý thuyết tập hợp, trong khi hầu hết các ngôn ngữ cấp cao ngày nay đều hướng đối tượng. Các lập trình viên đối tượng thường thích suy nghĩ trong các đối tượng và phải thay đổi tinh thần để sử dụng các công cụ dựa trên Set để lưu trữ các đối tượng của họ. Nói chung, sẽ tự nhiên hơn nhiều (đối với lập trình viên OO) chỉ cần cắt mã bằng ngôn ngữ họ chọn và thực hiện một số việc như object.save hoặc object.delete trong mã ứng dụng thay vì phải viết các truy vấn sql và gọi cơ sở dữ liệu để đạt được. cùng một kết quả.

Tất nhiên, đôi khi đối với những thứ phức tạp, SQL dễ sử dụng hơn và hiệu quả hơn, vì vậy sẽ rất tốt nếu bạn có khả năng xử lý cả hai loại công nghệ này.


5

IMO, vấn đề mà tôi thấy mọi người gặp phải với SQL không liên quan gì đến thiết kế quan hệ cũng như bản thân ngôn ngữ SQL. Nó liên quan đến kỷ luật mô hình hóa lớp dữ liệu, theo nhiều cách, về cơ bản khác với mô hình hóa một lớp nghiệp vụ hoặc giao diện. Các sai lầm trong mô hình hóa ở lớp trình bày thường dễ sửa hơn nhiều so với ở lớp dữ liệu nơi bạn có nhiều ứng dụng sử dụng cơ sở dữ liệu. Những vấn đề này cũng giống như những vấn đề gặp phải khi lập mô hình lớp dịch vụ trong thiết kế SOA, nơi bạn phải tính đến người tiêu dùng hiện tại của dịch vụ của bạn và các hợp đồng đầu vào và đầu ra.

SQL được thiết kế để tương tác với các mô hình cơ sở dữ liệu quan hệ. Có những mô hình dữ liệu khác đã tồn tại trong một thời gian, nhưng kỷ luật về thiết kế lớp dữ liệu đúng cách vẫn tồn tại bất kể mô hình lý thuyết được sử dụng là gì và do đó, những khó khăn mà các nhà phát triển thường gặp phải với SQL thường liên quan đến việc cố gắng áp đặt một mô hình không quan hệ mô hình dữ liệu trên một sản phẩm cơ sở dữ liệu quan hệ.


4

Đối với một điều, chúng làm cho việc sử dụng các truy vấn được tham số hóa trở nên tầm thường, bảo vệ bạn khỏi các cuộc tấn công SQL injection. Sử dụng SQL thô, từ góc độ này, rủi ro hơn, tức là dễ mắc lỗi hơn từ góc độ bảo mật. Họ cũng thường trình bày quan điểm hướng đối tượng trên cơ sở dữ liệu của bạn, giúp bạn giảm bớt việc phải thực hiện bản dịch này.


2
Đúng vậy, nhưng bạn không cần một ORM cho điều này
finnw

2
Việc sử dụng các truy vấn được tham số hóa là không dễ dàng khi viết SQL trực tiếp, miễn là bạn có một lớp giao diện cơ sở dữ liệu phù hợp (tức là một lớp hỗ trợ trình giữ chỗ). $dbh->do("DELETE FROM my_table WHERE some_value = ?", undef, $target_value); Đây. Làm xong.
Dave Sherohman 29/10/09

Tôi chưa bao giờ nói rằng bạn không thể viết các truy vấn được tham số hóa với RAW SQL. Tôi đã nói rằng việc sử dụng SQL thô sẽ rủi ro hơn vì bạn phải tự thực hiện nó. Tôi đã gặp nhiều trường hợp mã SQL thô trong đó truy vấn không được tham số hóa. ORM tự động cung cấp lợi ích này.
tvanfosson

2
Đúng, nhưng tránh đưa vào SQL là một việc dễ dàng ngay cả khi không có các câu lệnh chuẩn bị. Mỗi dự án tôi làm, tôi đều viết một hàm đơn giản đặt dấu ngoặc kép xung quanh một chuỗi và thoát khỏi bất kỳ dấu ngoặc kép nào được nhúng. Mất khoảng mười lăm phút để viết ngay cả khi tôi không sao chép nó từ một dự án trước đó. Sau đó, tôi sử dụng nó cho mọi chữ tôi nhúng vào một truy vấn. Điều khiến tôi đau đầu là các lập trình viên không làm điều này! Không mất mười lăm phút để tránh tiêm SQL có chủ ý hoặc - có thể là phổ biến hơn - ngẫu nhiên! Tại sao không?!
Jay

3
Jay, "chức năng đơn giản đặt dấu ngoặc kép xung quanh một chuỗi và thoát khỏi bất kỳ dấu ngoặc kép nhúng nào" có tính đến bộ ký tự hiện tại đang được sử dụng trên máy chủ không?
ygrek

4

Nghe nói nhiều gần đây? Tôi hy vọng bạn không nhầm lẫn điều này với phong trào NoSql. Theo như tôi biết thì chủ yếu là một số người sử dụng NoSql cho các ứng dụng web có khả năng mở rộng cao và dường như đã quên rằng SQL là một công cụ hiệu quả trong trường hợp không phải là "ứng dụng web có khả năng mở rộng cao".

Công việc kinh doanh lớp trừu tượng chỉ là phân loại sự khác biệt giữa mã Hướng đối tượng và mã dựa trên Bảng - Bộ chẳng hạn như SQL thích nói chuyện. Thông thường, điều này dẫn đến việc viết rất nhiều đĩa lò hơi và mã chuyển tiếp buồn tẻ giữa hai loại. ORM tự động hóa điều này và do đó tiết kiệm thời gian cho những người phản đối kinh doanh.


4

Đối với lập trình viên SQL có kinh nghiệm, mặt xấu là

  • Độ dài
  • Như nhiều người đã nói ở đây, SQL là khai báo, có nghĩa là tối ưu hóa không trực tiếp . Nó giống như tập hợp so với đua vòng quanh.
  • Các khuôn khổ cố gắng giải quyết tất cả các phương ngữ có thể có và không hỗ trợ các phím tắt của bất kỳ phương ngữ nào trong số chúng
  • Không có điều khiển phiên bản dễ dàng.

Đối với những người khác, lý do là

  • một số lập trình viên không giỏi về SQL. Có thể là do SQL hoạt động với các tập hợp, trong khi các ngôn ngữ lập trình hoạt động trong mô hình đối tượng hoặc chức năng. Suy nghĩ theo tập hợp (liên hợp, sản phẩm, giao nhau) là một vấn đề khó hiểu mà một số người không có.
  • một số hoạt động không tự giải thích: tức là lúc đầu không rõ ràng rằng ở đâu bộ lọc các bộ khác nhau.
  • có quá nhiều phương ngữ

Mục tiêu chính của các khuôn khổ SQL là giảm việc đánh máy của bạn. Bằng cách nào đó, chúng làm được, nhưng quá thường xuyên chỉ dành cho các truy vấn rất đơn giản. Nếu bạn thử làm điều gì đó phức tạp, bạn phải sử dụng chuỗi và gõ rất nhiều. Các khung công tác cố gắng xử lý mọi thứ có thể, như SQL Alchemy, trở nên quá lớn, giống như một ngôn ngữ lập trình khác.

[cập nhật ngày 26.06.10] Gần đây tôi đã làm việc với mô-đun Django ORM . Đây là khung SQL xứng đáng duy nhất mà tôi đã thấy. Và điều này giúp làm việc với nhiều thứ. Tuy nhiên, cốt liệu phức tạp khó hơn một chút.


3

SQL không phải là một ngôn ngữ khủng khiếp, nó chỉ đôi khi không chơi tốt với những ngôn ngữ khác.

Ví dụ, nếu bạn có một hệ thống muốn biểu diễn tất cả các thực thể dưới dạng các đối tượng trong một số ngôn ngữ OO hoặc ngôn ngữ khác, thì việc kết hợp điều này với SQL mà không có bất kỳ loại lớp trừu tượng nào có thể trở nên khá cồng kềnh. Không có cách nào dễ dàng để ánh xạ một truy vấn SQL phức tạp vào thế giới OO. Để giảm bớt căng thẳng giữa các thế giới đó, các lớp trừu tượng bổ sung được chèn vào (ví dụ: OR-Mapper).


tại sao nó là lỗi của SQL mà các ngôn ngữ OO không ánh xạ tốt với nó? Khi bạn sử dụng một dịch vụ, hãy tuân theo giao diện của nó hoặc không sử dụng nó.
KM.

2
Không ai nói rằng đó là lỗi SQL. Ngôn ngữ phổ biến của truy cập DB là SQL. Các ngôn ngữ của logic kinh doanh là một ngôn ngữ dựa trên OO. Hai người đó không hoàn toàn phù hợp nếu không có sự trợ giúp. Không có "lỗi" hoặc "vấn đề" ở đây, chỉ là một số yêu cầu ("làm cho chúng phù hợp") và một giải pháp được chấp nhận rộng rãi ("sử dụng OR-Mapper").
Joachim Sauer 29/10/09

Joachim Sauer cho biết SQL không phải là một ngôn ngữ khủng khiếp, nó chỉ không chơi quá tốt với những người khác Đối với tôi, có vẻ như ai đó đã nói đó là lỗi của SQL
KM.

1
@KM: Bạn đang nói rằng tiếng Pháp và tiếng Đức là những ngôn ngữ xấu? Họ không chơi tốt tất cả những thứ đó với tiếng Anh.
David Thornley

3

SQL là một ngôn ngữ thực sự tốt để thao tác dữ liệu. Từ góc độ nhà phát triển, điều tôi không thích với nó là việc thay đổi cơ sở dữ liệu không phá vỡ mã của bạn tại thời điểm biên dịch ... Vì vậy, tôi sử dụng tính năng trừu tượng để thêm tính năng này với giá của hiệu suất và có thể là tính biểu cảm của ngôn ngữ SQL , bởi vì trong hầu hết các ứng dụng, bạn không cần tất cả những thứ mà SQL có.

Lý do khác khiến SQL bị ghét là do cơ sở dữ liệu quan hệ.

Các CAP Định lý trở nên phổ biến:

Bạn có thể muốn những mục tiêu nào từ hệ thống dữ liệu dùng chung?

  • Nhất quán mạnh mẽ: tất cả khách hàng đều nhìn thấy cùng một chế độ xem, ngay cả khi có bản cập nhật
  • Tính sẵn sàng cao: tất cả các khách hàng có thể tìm thấy một số bản sao của dữ liệu, ngay cả khi có lỗi
  • Dung sai phân vùng: các thuộc tính hệ thống vẫn giữ ngay cả khi hệ thống được phân vùng

Định lý nói rằng bạn luôn có thể chỉ có hai trong ba thuộc tính CAP cùng một lúc

Địa chỉ cơ sở dữ liệu quan hệ Tính nhất quán mạnh và Khả năng chịu đựng phân vùng.

Vì vậy, ngày càng có nhiều người nhận ra rằng cơ sở dữ liệu quan hệ không phải là viên đạn bạc, và ngày càng có nhiều người bắt đầu từ chối nó vì tính khả dụng cao, vì tính khả dụng cao làm cho việc mở rộng quy mô theo chiều ngang trở nên dễ dàng hơn. Chia tỷ lệ theo chiều ngang được phổ biến vì chúng ta đã đạt đến giới hạn của định luật Moore , vì vậy cách tốt nhất để chia tỷ lệ là thêm nhiều máy hơn.

Nếu cơ sở dữ liệu quan hệ bị từ chối, SQL cũng bị từ chối.


3

SQL có nhiều sai sót, như một số áp phích khác ở đây đã chỉ ra. Tuy nhiên, tôi vẫn thích sử dụng SQL hơn nhiều công cụ mà mọi người cung cấp như các lựa chọn thay thế, bởi vì các "đơn giản hóa" thường phức tạp hơn những gì họ được cho là đơn giản hóa.

Giả thuyết của tôi là SQL được phát minh bởi một nhóm những người trượt tuyết xanh tháp ngà. Toàn bộ cấu trúc phi thủ tục. Nghe hay đấy: hãy nói cho tôi biết bạn muốn gì hơn là cách bạn muốn làm. Nhưng trong thực tế, thường dễ dàng hơn nếu chỉ đưa ra các bước. Thông thường, điều này có vẻ giống như cố gắng đưa ra các hướng dẫn bảo dưỡng ô tô bằng cách mô tả cách thức hoạt động của ô tô khi bạn hoàn thành. Vâng, bạn có thể nói: "Tôi muốn chiếc xe một lần nữa nhận được 30 dặm cho mỗi gallon, và để chạy với âm thanh ồn ào này như thế này ... hmmmm ... và vv" Nhưng nó sẽ không được dễ dàng hơn cho mọi người chỉ nói, "Thay thế các bugi"? Và ngay cả khi bạn tìm ra cách diễn đạt một truy vấn phức tạp bằng các thuật ngữ phi thủ tục, cơ sở dữ liệu thường đưa ra một kế hoạch thực thi rất kém hiệu quả để đạt được điều đó.

Và việc xử lý nulls khiến tôi phát điên! Đúng vậy, về mặt lý thuyết, nghe có vẻ tuyệt vời khi ai đó nói, "Này, nếu null nghĩa là chưa biết, thì việc thêm một giá trị chưa biết vào một giá trị đã biết sẽ cho một giá trị chưa biết. Rốt cuộc, theo định nghĩa, chúng tôi không biết giá trị chưa biết là gì . " Về mặt lý thuyết, hoàn toàn đúng. Trên thực tế, nếu chúng tôi có 10.000 khách hàng và chúng tôi biết chính xác số tiền 9.999 nợ chúng tôi nhưng có một số câu hỏi về số tiền nợ của khách hàng cuối cùng và ban giám đốc nói, "Tổng các khoản phải thu của chúng tôi là bao nhiêu?", Vâng, theo toán học chính xác câu trả lời là "Tôi không biết". Nhưng câu trả lời thực tế là "chúng tôi tính toán $ 4,327.287,42 nhưng một tài khoản đang được đề cập nên con số đó không chính xác". Tôi chắc rằng ban lãnh đạo thà đóng cửa nếu không phải là một con số nhất định hơn là một cái nhìn trống rỗng.

Tất cả những gì đã nói, tôi vẫn muốn sử dụng SQL hơn là một số lớp được xây dựng trên SQL, điều đó chỉ tạo ra một tập hợp toàn bộ khác mà tôi cần học và sau đó tôi phải biết rằng cuối cùng điều này sẽ được dịch sang SQL, và đôi khi Tôi chỉ có thể tin tưởng nó để thực hiện bản dịch một cách chính xác và hiệu quả, nhưng khi mọi thứ trở nên phức tạp thì tôi không thể, vì vậy bây giờ tôi phải biết thêm lớp, tôi vẫn phải biết SQL và tôi phải biết nó sẽ dịch như thế nào. để tôi có thể lừa lớp lừa SQL làm điều đúng. Arggh.


3
Toàn bộ ý tưởng cơ sở dữ liệu quan hệ là sản phẩm của những người chọc trời xanh tháp ngà. Cơ sở dữ liệu quan hệ ban đầu có hiệu suất khủng khiếp so với cơ sở dữ liệu phân cấp hiện tại và mất nhiều thời gian để thiết lập. Sức mạnh của sự trừu tượng hóa đến mức cơ sở dữ liệu phân cấp về cơ bản đã trở thành dĩ vãng (không phải là không có cơ sở dữ liệu IMS và CODASYL ngoài kia). Nó phải hoạt động rất, rất tốt.
David Thornley

1
Nhưng ban quản lý sẽ không thấy "đóng nếu không phải là một số nhất định" - họ sẽ thấy một số sai. Có thể khách hàng cuối cùng đó nợ rất nhiều tiền. Sau đó quản lý sẽ rất không hài lòng về con số sai đó.
HTTP 410

RoadWarrior: Vâng, có thể bạn có 10.000 khách hàng, mỗi người nợ bạn 10 đô la và 1 khách hàng nợ bạn 10 triệu đô la. Nhưng nếu đúng như vậy, bất kỳ ai yêu cầu báo cáo AR có thể sẽ biết rất rõ tên của khách hàng đó và biết chính xác những gì đang xảy ra với họ. Được rồi, tôi chắc rằng có những lúc không có câu trả lời nào tốt hơn một câu trả lời không đáng tin cậy đến mức trở nên vô nghĩa. Nhưng đó là quan điểm của tôi: SQL được thiết kế dựa trên những cân nhắc lý thuyết như thế: một giáo điều "bất cứ thứ gì kém hơn sự hoàn hảo đều vô giá trị". ...
Jay

... Trong cuộc sống thực, 95% thời gian, một câu trả lời gần đúng tốt hơn một cái nhìn chằm chằm. Khi tôi nhìn vào sổ séc của mình, tôi biết rằng rất có thể tôi đã mắc lỗi số học hoặc quên viết séc. Số dư cũng có thể là một con số gần đúng. Nhưng vẫn còn, nếu tôi biết mình có "khoảng 1.000 đô la", tôi sẽ không ngại viết séc 50 đô la, và tôi sẽ nhận ra rằng viết séc 10.000 đô la sẽ vô ích.
Jay

Chà, tôi đang điều hành một doanh nghiệp, và nó không bao giờ là 10K so với 1. IMX, nó giống như 20 ẩn số cho mỗi 100 được biết (nguyên tắc pareto). Và một số trong số 20 người đó nợ chúng tôi rất nhiều tiền, đó thực sự là lý do tại sao số tiền thực tế đang bị tranh chấp. Một lần nữa, đây là nguyên tắc pareto.
HTTP 410

3

• Mọi nhà cung cấp đều mở rộng cú pháp SQL để phù hợp với nhu cầu của họ. Vì vậy, trừ khi bạn đang làm những việc khá đơn giản, mã SQL của bạn không thể di động.

• Cú pháp của SQL không trực giao; ví dụ: các câu lệnh select, insert, update,deleteđều có cấu trúc cú pháp hoàn toàn khác nhau.


1
Làm thế nào để điều đó làm cho cú pháp không trực giao?
Amok

1
Ngôn ngữ có thể được thiết kế để tất cả các câu lệnh mệnh lệnh này có một cú pháp chung hơn, đặc biệt là giữa các phép toán insertupdate, gần như giống nhau về mặt ngữ nghĩa, nhưng hoàn toàn khác nhau về mặt cú pháp.
David R Tribble

2

Tôi đồng ý với quan điểm của bạn, nhưng để trả lời câu hỏi của bạn, một điều làm cho SQL trở nên "khủng khiếp" là việc thiếu tiêu chuẩn hóa hoàn toàn T-SQL giữa các nhà cung cấp cơ sở dữ liệu (Sql Server, Oracle, v.v.), điều này khiến cho mã SQL không chắc hoàn toàn di động. Các lớp trừu tượng hóa cơ sở dữ liệu giải quyết vấn đề này, mặc dù với chi phí hiệu suất (đôi khi là rất nghiêm trọng).


2
Tôi không hiểu làm thế nào mà sự không tương thích phương ngữ SQL lại có thể là một "điểm" lớn như vậy đối với SQL. Điều đó giống như nói C là tào lao vì bạn không thể chỉ biên dịch + chạy cùng một nguồn trong các bản phân phối Linux khác nhau.
Jeff Meatball Yang

1
@Jeff: Thực ra tôi không nghĩ đó là một điểm quá lớn so với SQL. Đó là lý do tại sao tôi nói "Tôi đồng ý với điểm của bạn" và đặt "khủng khiếp" trong dấu ngoặc kép. Tôi thích SQL trên các lớp dữ liệu trừu tượng, bản thân mình, mặc dù tôi là điều vui mừng như NHibernate tồn tại bởi vì họ đang nhiều hơn các crap cây nhà lá vườn mà sử dụng để sinh sôi nảy nở.
MusiGenesis 29/10/09

1
Đúng - tôi cũng sử dụng các lớp trừu tượng - tôi đoán tôi muốn nói rằng, đối với tôi, ngôn ngữ SQL không phải là vấn đề - đó là việc chuyển đổi dữ liệu chuẩn hóa thành các đối tượng, đó là lý do tại sao các lớp trừu tượng lại hữu ích.
Jeff Meatball Yang

2

Sống với SQL thuần túy thực sự có thể là một địa ngục bảo trì. Đối với tôi, lợi thế lớn nhất của ORM là khả năng cấu trúc lại mã một cách an toàn mà không cần các thủ tục "tái cấu trúc DB" tẻ nhạt. Có các khuôn khổ kiểm tra đơn vị tốt và các công cụ tái cấu trúc cho các ngôn ngữ OO, nhưng tôi vẫn chưa thấy đối tác của Resharper cho SQL, chẳng hạn.

Tất cả các DAL đều có SQL đằng sau hậu trường, và bạn vẫn cần biết nó để hiểu những gì đang xảy ra với cơ sở dữ liệu của bạn, nhưng làm việc hàng ngày với lớp trừu tượng tốt trở nên dễ dàng hơn.


xử lý các trường hợp của các đối tượng trong bộ nhớ hoàn toàn khác với dữ liệu được lưu trữ vật lý trong cơ sở dữ liệu. có nhiều khó khăn hơn khi sửa chữa các thiết kế kém và có thể có nhiều biến thể về hiệu suất dựa trên "những điều nhỏ nhặt"
KM.

2

Nếu bạn chưa sử dụng SQL quá nhiều, tôi nghĩ vấn đề chính là thiếu các công cụ dành cho nhà phát triển tốt.

Nếu bạn có nhiều kinh nghiệm với SQL, bạn sẽ cảm thấy thất vọng vì không kiểm soát được kế hoạch thực thi. Đây là một vấn đề cố hữu trong cách SQL được chỉ định cho các nhà cung cấp. Tôi nghĩ SQL cần trở thành một ngôn ngữ mạnh mẽ hơn để thực sự khai thác công nghệ cơ bản (rất mạnh mẽ).


2

Nhanh chóng, hãy viết cho tôi SQL để phân trang tập dữ liệu hoạt động trong MySQL, Oracle, MSSQL, PostgreSQL và DB2.

Ồ, đúng rồi, SQL chuẩn không xác định bất kỳ toán tử nào để giới hạn số lượng kết quả trả về và bắt đầu từ hàng nào.


5
Tại sao bạn lại cố gắng nhắm mục tiêu tất cả các môi trường đó bằng mã của mình? Viết cho tôi mã C cho các luồng hoạt động trong Mac OS 9, Windows NT, OS / 2 Warp và Solaris.
Steven Huwig

2
@Steven Huwig: Tôi có thể sử dụng một lớp trừu tượng để làm điều đó cho tôi ... đó chính xác là những gì câu hỏi được đặt ra.
Powerlord

@Steven: Tôi tình cờ sử dụng các khuôn khổ và các lớp trừu tượng cho khá nhiều thứ mà tôi cần phải độc lập với nền tảng. Tuy nhiên, độc lập cơ sở dữ liệu quan trọng hơn nhiều trong hầu hết các trường hợp. Ngay cả khi bạn chỉ cung cấp phần mềm của mình để chạy trên Windows, một khi bạn muốn bán nó cho các tập đoàn lớn hơn, bạn sẽ gặp phải mọi thứ từ "Chúng tôi thích OSS hơn, bạn có hỗ trợ MySQL không" đến "Chúng tôi sử dụng Oracle | MSSQL | bất cứ điều gì như một tiêu chuẩn của công ty, bạn có ủng hộ nó không ”.
Fredrik

2

Không có tình yêu dành cho SQL vì SQL không tốt về cú pháp, ngữ nghĩa và cách sử dụng hiện tại. Tôi sẽ giải thích:

  • cú pháp của nó là một mảnh đạn cobol, tất cả những lời chỉ trích về cobol đều áp dụng ở đây (ở mức độ thấp hơn, công bằng mà nói). Cố gắng trở thành ngôn ngữ tự nhiên như mà không thực sự cố gắng diễn giải ngôn ngữ tự nhiên sẽ tạo ra cú pháp ngẫu nhiên (đó là DROP TABLE hay DROP, UPDATE TABLE, UPDATE hoặc UPDATE IN, DELETE hoặc DELETE FROM ...) và các đặc điểm cú pháp như SELECT (bao nhiêu trang thì nó lấp đầy?)
  • ngữ nghĩa cũng có sai sót sâu sắc, Date giải thích nó rất chi tiết, nhưng sẽ đủ lưu ý rằng logic ba giá trị boolean không thực sự phù hợp với đại số quan hệ trong đó một hàng chỉ có thể là một phần của bảng.
  • có một ngôn ngữ lập trình làm giao diện chính (và thường là duy nhất) cho cơ sở dữ liệu được chứng minh là một lựa chọn thực sự tồi và nó đã tạo ra một loại lỗi bảo mật mới

1

Tôi đồng ý với hầu hết các bài viết ở đây rằng cuộc tranh luận về tiện ích của SQL chủ yếu là chủ quan, nhưng tôi nghĩ nó chủ quan hơn về bản chất nhu cầu kinh doanh của bạn.

Như Stefan Steinegger đã chỉ ra, các ngôn ngữ khai báo rất tốt cho việc xác định những gì bạn muốn chứ không phải cách bạn muốn làm. Điều này có nghĩa là các triển khai SQL khác nhau của bạn là phù hợp từ góc độ cấp cao: nghĩa là, nếu tất cả những gì bạn muốn là lấy một số dữ liệu và không có gì khác quan trọng, bạn có thể tự thỏa mãn với việc viết các truy vấn tương đối đơn giản và chọn triển khai SQL điều đó phù hợp với bạn.

Nếu bạn làm việc ở cấp độ "thấp" hơn nhiều và bạn cần tự mình tối ưu hóa tất cả những thứ đó, thì điều đó còn xa lý tưởng. Sử dụng thêm một lớp trừu tượng có thể hữu ích, nhưng nếu những gì bạn thực sự đang cố gắng làm là chỉ định các phương pháp để tối ưu hóa truy vấn, v.v., thì việc thêm người trung gian khi cố gắng tối ưu hóa sẽ hơi phản cảm.

Vấn đề lớn nhất mà tôi gặp phải với SQL cũng giống như các ngôn ngữ "chuẩn hóa" khác, có rất ít tiêu chuẩn thực sự. Tôi gần như muốn học một ngôn ngữ hoàn toàn mới giữa Sybase và MySQL để không bị nhầm lẫn hai quy ước.


Bạn có thể tự tiết kiệm kha khá nỗi đau đó bằng cách không sử dụng MySQL. ;)
Steven Huwig

1

Mặc dù SQL hoàn thành công việc nhưng chắc chắn có vấn đề ...


  • nó cố gắng đồng thời là mức độ cao và mức độ trừu tượng thấp , và điều đó thật ... kỳ quặc. Có lẽ nó nên có hai hoặc nhiều tiêu chuẩn ở các cấp độ khác nhau.
  • đó là một thất bại lớn như một tiêu chuẩn . Rất nhiều điều xảy ra sai lầm khi một tiêu chuẩn hoặc không ổn định trong mọi thứ, yêu cầu quá nhiều triển khai, yêu cầu quá ít hoặc vì lý do nào đó không hoàn thành mục tiêu xã hội một phần là thúc đẩy các nhà cung cấp và người triển khai sản xuất các bản triển khai hoàn chỉnh có thể tương thích một cách nghiêm ngặt. Bạn chắc chắn không thể nói SQL đã làm được điều đó. Xem xét một số tiêu chuẩn khác và lưu ý rằng sự thành công hay thất bại của tiêu chuẩn rõ ràng là một yếu tố của sự hợp tác hữu ích đạt được:
    • RS-232 ( Lỗi , gần như không được chỉ định đủ, ngay cả chân nào truyền và chân nào nhận là tùy chọn, sheesh. Bạn có thể tuân thủ nhưng vẫn không đạt được gì. Cơ hội tương tác thành công: thực sự thấp cho đến khi PC IBM trở thành tiêu chuẩn hữu ích trên thực tế .)
    • IEEE 754-1985 Floating Point ( Xấu , tiếp cận quá mức: không một siêu máy tính hoặc máy trạm khoa học hoặc bộ vi xử lý RISC nào từng áp dụng nó, mặc dù cuối cùng sau 20 năm, chúng tôi đã có thể triển khai nó một cách độc đáo trong HW. Ít nhất thì thế giới cuối cùng cũng phát triển thành công nó.)
    • C89, C99, PCI, USB, Java ( Tốt , dù là tiêu chuẩn hay thông số kỹ thuật, chúng đã thành công trong việc thúc đẩy sự tuân thủ nghiêm ngặt từ hầu hết mọi người và sự tuân thủ đó dẫn đến khả năng tương tác thành công.)
  • nó không được chọn làm cơ sở dữ liệu quan trọng nhất trên thế giới . Mặc dù đây là một điểm dữ liệu hơn là một lý do, thực tế là Google Bigtable không phải là SQL và không quan hệ là một loại phản thành tích đối với SQL.

0

Tôi không thích SQL, nhưng tôi cũng không muốn phải viết nó như một phần của những gì tôi đang phát triển. DAL không phải là về tốc độ đưa ra thị trường - thực ra, tôi chưa bao giờ nghĩ rằng sẽ có một triển khai DAL nhanh hơn các truy vấn trực tiếp từ mã. Nhưng mục tiêu của DAL là trừu tượng hóa . Tính trừu tượng đi kèm với cái giá phải trả, và ở đây là nó sẽ mất nhiều thời gian hơn để thực hiện.

Tuy nhiên, lợi ích là rất lớn. Viết các bài kiểm tra gốc xung quanh mã, sử dụng các lớp biểu cảm, bộ dữ liệu được đánh máy mạnh, v.v. Chúng tôi sử dụng "DAL" trong số các loại, đây là một triển khai DDD thuần túy sử dụng Generics trong C #. Vì vậy, chúng tôi có các kho lưu trữ chung, đơn vị triển khai công việc (giao dịch dựa trên mã) và phân tách hợp lý. Chúng ta có thể làm những việc như mô phỏng bộ dữ liệu của mình mà không cần nỗ lực nhiều và thực sự phát triển trước các triển khai cơ sở dữ liệu. Đã có một khoản chi phí trả trước trong việc xây dựng một khuôn khổ như vậy, nhưng rất hay khi logic kinh doanh lại là ngôi sao của chương trình. Chúng tôi sử dụng dữ liệu như một tài nguyên ngay bây giờ và xử lý nó bằng ngôn ngữ mà chúng tôi đang sử dụng nguyên bản trong mã. Một lợi ích bổ sung của cách tiếp cận này là sự tách biệt rõ ràng mà nó cung cấp. Ví dụ: tôi không còn thấy một truy vấn cơ sở dữ liệu trong một trang web. Có, trang đó cần dữ liệu. Có, cơ sở dữ liệu có liên quan. Nhưng bây giờ, bất kể tôi đang lấy dữ liệu từ đâu, vẫn có một (và duy nhất) nơi để vào mã và tìm nó. Có thể không phải là vấn đề lớn đối với các dự án nhỏ hơn, nhưng khi bạn có hàng trăm trang trong một trang web hoặc hàng chục cửa sổ trong một ứng dụng máy tính để bàn, bạn thực sự có thể đánh giá cao nó.

Là một nhà phát triển, tôi được thuê để thực hiện các yêu cầu của doanh nghiệp bằng cách sử dụng các kỹ năng logic và phân tích của mình - và việc triển khai khuôn khổ của chúng tôi cho phép tôi làm việc hiệu quả hơn bây giờ. Là một người quản lý, tôi muốn các nhà phát triển của mình sử dụng các kỹ năng phân tích và logic của họ để giải quyết vấn đề hơn là viết SQL. Thực tế là chúng ta có thể xây dựng toàn bộ một ứng dụng sử dụng cơ sở dữ liệu mà không cần có cơ sở dữ liệu cho đến khi gần kết thúc chu kỳ phát triển là một điều tuyệt vời. Nó không có nghĩa là một cú đánh chống lại các chuyên gia cơ sở dữ liệu. Đôi khi việc triển khai cơ sở dữ liệu phức tạp hơn giải pháp. SQL (và trong trường hợp của chúng ta, cụ thể là View và Stored Procs) là một điểm trừu tượng nơi mã có thể sử dụng dữ liệu như một dịch vụ. Trong các cửa hàng có sự tách biệt rõ ràng giữa dữ liệu và nhóm phát triển, điều này giúp loại bỏ việc ngồi trong một mô hình giữ để chờ triển khai và thay đổi cơ sở dữ liệu. Các nhà phát triển có thể tập trung vào miền sự cố mà không cần di chuột qua DBA và DBA có thể tập trung vào việc triển khai chính xác mà nhà phát triển không cần nóngay bây giờ .


1
Phản đối - quan tâm giải thích tại sao hoặc chỉ cần nhấp vào nút xuống cho mọi thứ bạn không đồng ý?
Joseph Ferris

0

Nhiều bài viết ở đây dường như lập luận rằng SQL là xấu vì nó không có các tính năng "tối ưu hóa mã" và bạn không có quyền kiểm soát các kế hoạch thực thi.

Điều mà các công cụ SQL giỏi là đưa ra một kế hoạch thực thi cho một lệnh bằng văn bản, hướng tới dữ liệu , nội dung thực tế . Nếu bạn quan tâm đến khía cạnh lập trình của mọi thứ, bạn sẽ thấy rằng có nhiều dữ liệu hơn là byte được chuyển giữa các tầng ứng dụng.

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.