Robert C. Martin có nghĩa là gì bởi SQL là không cần thiết? [đóng cửa]


45

Tôi đã đọc / xem rất nhiều nội dung của Robert C. Martin. Tôi đã bắt gặp anh ta nói rằng SQL là không cần thiết vì các ổ đĩa trạng thái rắn. Khi tôi tìm kiếm các nguồn khác để sao lưu này, tôi nhận được một loạt các bài viết ngẫu nhiên mô tả sự khác biệt về hiệu suất SQL giữa các ổ đĩa cứng và ổ đĩa trạng thái rắn (có liên quan nhưng không phải là những gì tôi đang cố gắng nghiên cứu).

Cuối cùng, tôi không hiểu anh ấy đang cố gắng làm gì. Có phải ông đang nói thay thế SQL bằng các công nghệ No-SQL? Có phải ông đang nói lưu trữ dữ liệu trong các tệp trong một hệ thống tệp? Hay anh ta chỉ muốn mọi người ngừng sử dụng Cơ sở dữ liệu SQL / Quan hệ vì các cuộc tấn công SQLi? Tôi sợ rằng tôi đang thiếu điểm mà anh ấy đang cố gắng thực hiện.

Tôi sẽ cung cấp một số liên kết ở đây để bạn có thể đọc thẳng từ tâm trí của anh ấy:

  1. Bàn Bobby
  2. Bài giảng kiến ​​trúc sạch

Đầu tiên, ông tuyên bố rằng SQL nên được loại bỏ hoàn toàn khỏi hệ thống.

Giải pháp. Giải pháp duy nhất. Là để loại bỏ SQL hoàn toàn khỏi hệ thống. Nếu không có công cụ SQL, thì không thể có các cuộc tấn công SQLi.

Và mặc dù anh ấy nói về việc thay thế SQL bằng API, tôi KHÔNG nghĩ anh ấy có nghĩa là đặt SQL đằng sau một API vì câu nói trước đó và những gì anh ấy đã nói trước đó trong bài viết.

Các khung không xử lý vấn đề; ...

Lưu ý bên lề: Khi nói SQL, tôi khá chắc chắn Robert có nghĩa là hầu hết các cơ sở dữ liệu quan hệ. Có lẽ không phải tất cả nhưng hầu hết. Trong mọi trường hợp, hầu hết mọi người đang sử dụng SQL. vì thế...

Nếu SQL không được sử dụng để duy trì dữ liệu, vậy thì chúng ta phải sử dụng cái gì?

Trước khi trả lời, tôi cũng cần lưu ý. Robert nhấn mạnh rằng các ổ đĩa trạng thái rắn nên thay đổi các công cụ mà chúng ta sử dụng để duy trì dữ liệu. Câu trả lời của Søren D. Ptæus chỉ ra điều này.

Tôi cũng phải trả lời nhóm "nhưng toàn vẹn dữ liệu". Sau khi nghiên cứu thêm, Robert nói rằng chúng ta nên sử dụng cơ sở dữ liệu giao dịch như datomic . Sau đó CRUD biến thành CR (tạo và đọc) và các giao dịch SQL biến mất hoàn toàn. Toàn vẹn dữ liệu là tất nhiên quan trọng.

Tôi không thể tìm thấy một câu hỏi bao gồm tất cả những điều này. Tôi đoán tôi đang tìm giải pháp thay thế phù hợp với hướng dẫn của Robert. Datomic là một nhưng là nó? Những lựa chọn khác phù hợp với những hướng dẫn này? Và họ thực sự làm việc tốt hơn với các ổ đĩa trạng thái rắn?


5
@ christo8989 - "Ý anh ta là gì khi thay thế SQL bằng API?". Tôi hiểu anh ta có nghĩa là bạn không có ngôn ngữ truy vấn văn bản (được chuyển đến một công cụ SQL) trên toàn bộ cơ sở mã của bạn. Bạn ẩn điều này đằng sau một API chỉ hiển thị các cơ chế an toàn để mô tả các truy vấn. Nội bộ đến một cái gì đó API có để tạo ra các lệnh để động cơ SQL, nhưng đó là một khu vực nhỏ hơn bề mặt mà bạn có thể thực thi sử dụng các tham số ràng buộc, vv, kiểm soát những người làm thay đổi, vv
andrew

42
Nhưng, nhưng, nhưng ... SQL một API. Đây là API cho RDBMS. Nó chỉ là một API rất mạnh có thể dễ dàng sử dụng sai.
Bart van Ingen Schenau

25
Nếu bạn tạo API DB không có giao diện văn bản, sớm muộn một số lập trình viên nghèo sẽ viết mã trông như thế này : eval(request.GET["table_name"] + ".get(pk=" + request.GET["pk"] + ")")). Đó không phải là SQL thực sự có lỗi, mà là những lập trình viên kém, không biết gì.
Lie Ryan

6
@JimmyJames SQL là một ngôn ngữ có, nhưng điều đó không có nghĩa đó không phải là một API. SQL là ngôn ngữ cung cấp API để truy cập một số bộ lưu trữ cơ bản.
Khối

5
@nocomprende SQL luôn được thiết kế để sử dụng cho các ứng dụng. Nó sẽ hầu như vô dụng nếu không. Vấn đề luôn là cung cấp cho các ứng dụng một số cách để lưu trữ và truy xuất dữ liệu mà không gặp rắc rối với các định dạng tùy chỉnh kỳ lạ hoặc thậm chí phải quan tâm rất nhiều về cách lưu trữ dữ liệu.
Khối

Câu trả lời:


74

Bob Martin rõ ràng là phóng đại để làm cho quan điểm của mình rõ ràng hơn. Nhưng quan điểm của anh ấy là gì?

Có phải anh ta chỉ muốn mọi người ngừng sử dụng Cơ sở dữ liệu SQL / Quan hệ vì các cuộc tấn công SQLi?

Theo hiểu biết của tôi, trong bài đăng trên blog đó (liên kết đầu tiên của bạn) Martin cố gắng thuyết phục mọi người ngừng sử dụng SQL, nhưng không phải là cơ sở dữ liệu quan hệ. Đây là hai điều khác nhau .

SQL là một ngôn ngữ cực kỳ mạnh mẽ và nó được chuẩn hóa ở một mức độ nào đó. Nó cho phép tạo các truy vấn và lệnh phức tạp một cách rất nhỏ gọn, theo kiểu dễ đọc, dễ hiểu, dễ học. Nó không phụ thuộc vào ngôn ngữ lập trình khác, vì vậy hầu hết các lập trình viên ứng dụng đều có thể sử dụng được, bất kể họ thích Java, C, C ++, C #, Python, Ruby, JavaScript, Basic, Go, Perl, PHP hay thứ gì khác.

Tuy nhiên, sức mạnh này phải trả giá : viết các truy vấn / lệnh SQL an toàn khó hơn viết các lệnh không an toàn. API an toàn sẽ giúp bạn dễ dàng tạo các truy vấn an toàn "theo mặc định". Những người có khả năng không an toàn nên cần nhiều nỗ lực tinh thần hơn hoặc ít nhất là nhiều hơn. Đó là IMHO tại sao Martin lại phát cuồng chống lại SQL ở dạng hiện tại.

Vấn đề không phải là mới và có các API an toàn hơn SQL tiêu chuẩn để truy cập cơ sở dữ liệu quan hệ. Ví dụ: tất cả những người lập bản đồ OR mà tôi biết đang cố gắng cung cấp API như vậy (mặc dù chúng thường được thiết kế cho các mục tiêu chính khác). Các biến thể SQL tĩnh khiến bạn khó tạo ra bất kỳ truy vấn động nào với dữ liệu đầu vào không được xác thực (và đó không phải là một phát minh mới: SQL nhúng, thường sử dụng SQL tĩnh, khoảng 30 năm tuổi).

Thật không may, tôi không biết bất kỳ API nào linh hoạt, chuẩn hóa, trưởng thành, độc lập với ngôn ngữ và cũng mạnh mẽ như SQL, đặc biệt là SQL động. Đó là lý do tại sao tôi có một số nghi ngờ về đề xuất "không sử dụng SQL" của Martin như một cách giải quyết vấn đề thực tế. Vì vậy, hãy đọc bài viết của anh ấy như một suy nghĩ đi đúng hướng, không phải là một "thực hành tốt nhất" mà bạn có thể theo dõi một cách mù quáng từ ngày mai.


2
Ít nhất chúng ta có thể tránh sử dụng nó cho bất kỳ thao tác viết thông thường nào với những thứ tương tự ORM cung cấp. Đối với truy vấn cơ sở dữ liệu, bạn đã có thể thực hiện một số công việc mà không cần viết SQL của riêng bạn. Ngày nay, chỉ có cách sử dụng "nâng cao" của capabitflower cơ sở dữ liệu nên yêu cầu viết SQL hoặc sử dụng kiểu dữ liệu phức tạp (biểu đồ, dữ liệu địa lý, đệ quy).
Walfrat

7
Martin đặc biệt lập luận rằng API để sử dụng không nên mạnh mẽ như SQL; Lập luận của ông rằng sức mạnh của SQL là vấn đề, không phải là một tính năng. API mà anh ấy tranh luận phải là ứng dụng cụ thể và chỉ linh hoạt và mạnh mẽ như ứng dụng hoàn toàn cần, không hơn thế. Anh ta đặc biệt lập luận chống lại việc phát minh ra một ngôn ngữ truy vấn dựa trên chuỗi khác.
Khối

3
@Cubic: bất kỳ giải pháp nào cho các vấn đề được Martin đề cập có lẽ cần ít mạnh mẽ hơn hoặc ít dễ sử dụng hơn SQL - đó là phước lành và lời nguyền của họ.
Doc Brown

1
@Barmar: SQL có mức độ cao như bạn có thể nhận được và Bob đang khẳng định rằng nó không an toàn một cách rõ ràng.
Robert Harvey

3
@ christo8989: Tôi không nghĩ sẽ có ý nghĩa khi cố gắng viết một câu trả lời như một câu trả lời cho tất cả những gì Martin đã từng viết hoặc nói trong sự nghiệp của mình. Câu trả lời của tôi là một cho câu hỏi đưa ra trong tiêu đề của bạn, giải thích chủ yếu cách bài viết blog trong liên kết đầu tiên bạn đưa ra nên IMHO được diễn giải.
Doc Brown

57

Ý kiến ​​của Bob Martin chỉ là vậy; ý kiến ​​của một người đàn ông.

Một lập trình viên dự kiến ​​sẽ hiểu hệ thống mà anh ta viết đủ tốt để thực hiện sự quan tâm hợp lý về bảo mật và hiệu suất của nó. Điều đó có nghĩa là, nếu bạn đang nói chuyện với cơ sở dữ liệu SQL, bạn sẽ làm những gì trang web của Bobby Bảng nói để làm: bạn vệ sinh dữ liệu đầu vào của mình. Điều đó có nghĩa là bạn đặt cơ sở dữ liệu SQL của mình trên một máy hứa hẹn hiệu năng đầy đủ. Có những cách rất nổi tiếng và được hiểu rõ để làm những việc này, và trong khi chúng không đảm bảo an ninh tuyệt đối hoặc hiệu suất lý tưởng, thì không có gì khác.

Khẳng định rằng chúng tôi không cần SQL nữa vì hiện tại chúng tôi có SSD chỉ là thông số kỹ thuật. SQL không được phát minh vì ổ cứng tốc độ cao chưa tồn tại; nó được phát minh bởi vì chúng tôi cần một cách tiêu chuẩn công nghiệp để thể hiện các khái niệm truy xuất dữ liệu. Các hệ thống cơ sở dữ liệu quan hệ có nhiều phẩm chất khác bên cạnh tốc độ và bảo mật khiến chúng trở nên lý tưởng cho các hoạt động kinh doanh; đặc biệt là ACID . Tính toàn vẹn dữ liệu ít nhất cũng quan trọng như tốc độ hoặc bảo mật và nếu bạn không có nó, vậy thì điểm nào để bảo mật dữ liệu xấu hoặc truy xuất dữ liệu đó càng nhanh càng tốt?

Trước khi bạn lấy sự cuồng loạn của một người làm phúc âm, tôi khuyên bạn nên tìm hiểu về ứng dụng và bảo mật hệ thống và hiệu suất theo cách riêng của họ, chứ không phải bằng cách đọc các bài báo ngẫu nhiên trên Internet. Có nhiều thứ hơn để bảo mật, hiệu suất và thiết kế hệ thống mạnh mẽ hơn là chỉ đơn giản là "tránh công nghệ này".

Chúng tôi không cấm dao nhà bếp vì một vài người không may mắn đã vô tình cắt ngón tay của họ với họ.


16
Tôi không giải thích các bài viết của Martin là ủng hộ việc từ bỏ RDBMS, mà là sử dụng các cách tương tác khác với chúng, ví dụ như LINQ-to-SQL hoặc JPA Criteria API, thay vì trực tiếp mã hóa hoặc thao tác các chuỗi SQL trong mã nguồn của chúng tôi.
Jules

27
Vì vậy, chúng ta không nên mù quáng làm theo những gì anh ấy nói ... nhưng anh ấy đang nói gì?
TRiG

33
Một điều tôi thực sự không thích về cộng đồng ở đây là, ngay khi bạn đặt câu hỏi về việc làm gì đó trong Bộ luật sạch / Chú Bob -way , là mọi người sẽ nói với bạn rằng bạn nên làm gì khác đi . "Làm thế nào để vẽ như van Gogh?" - "van Gogh đã sai, thay vào đó bạn nên vẽ như Picasso".
R. Schmitz

21
vệ sinh dữ liệu đầu vào để tránh các cuộc tấn công tiêm nên là tùy chọn sao lưu sau khi sử dụng các phương thức tham số để tách mã khỏi đầu vào.
quái vật ratchet

17
Tất cả các công nghệ là cam chịu và về cơ bản là thiếu sót. Nó chỉ là một vấn đề thời gian. Trong khi đó, chúng tôi có những thứ mà chúng tôi cần phải làm, với các công nghệ còn thiếu sót và cam chịu của chúng tôi.

15

Anh ấy thực sự đang nói gì?

Có phải ông đang nói thay thế SQL bằng các công nghệ No-SQL?

TL; DR: Có (sắp xếp)

Trong một cuộc nói chuyện gần đây hơn so với cuộc trò chuyện mà bạn liên kết về cơ bản cùng một chủ đề, ông nói: "Cơ sở dữ liệu là một chi tiết. Tại sao chúng ta có cơ sở dữ liệu?" .

Ông tuyên bố cơ sở dữ liệu là để giúp truy cập dữ liệu từ các đĩa quay dễ dàng hơn, nhưng trong tương lai "[...] sẽ không có đĩa" nhờ vào công nghệ mới và cái mà ông gọi là "RAM liên tục" và điều đó sẽ dễ dàng hơn lưu trữ dữ liệu bằng cách sử dụng các cấu trúc mà các lập trình viên sử dụng, chẳng hạn như hashtables hoặc cây.

Ông tiếp tục dự đoán rằng các cơ sở dữ liệu quan hệ trên tổng thể sẽ biến mất phần lớn do sự cạnh tranh mới của họ:

Nếu tôi là Oracle, tôi sẽ khá sợ hãi vì lý do cho sự tồn tại của tôi đang bốc hơi từ bên dưới tôi. [...] Lý do cho cơ sở dữ liệu tồn tại đang biến mất.

Có lẽ sẽ có một số bảng quan hệ tồn tại, nhưng bây giờ có một số cạnh tranh lành mạnh .

Vì vậy, đối với anh ta, không chỉ về việc tiêm SQL, mặc dù anh ta cho rằng SQL không hoàn toàn sai sót về vấn đề này .


Ghi chú của tác giả:

Các tuyên bố trong bài viết này chỉ là trích dẫn để hiểu quan điểm của Robert C. Martin về chủ đề này và không đại diện cho ý kiến ​​của tác giả. Để có quan điểm khác biệt hơn, hãy xem câu trả lời của Robert Harvey .


2
"RAM liên tục" dường như chỉ giải quyết việc sử dụng cơ sở dữ liệu để tuần tự hóa trạng thái ứng dụng hiện tại mà không liên quan đến khả năng tương thích ngược hoặc ngược. Chắc chắn, một số cơ sở dữ liệu được sử dụng theo cách đó nhưng không có nghĩa là tất cả chúng (tôi nhận ra rằng Martin nói điều này, không phải bạn).
Khối

7
Vì vậy, Martin thực sự đang nói rằng điểm duy nhất của cơ sở dữ liệu là trừu tượng hóa trên lưu trữ chậm? Ồ Sau đó, điều này ủng hộ câu trả lời của Robert Harvey: Ý kiến ​​của anh ta nên được đưa ra với một hạt muối khổng lồ. Ví dụ, quan điểm này không xem xét rằng giá trị của DB đang duy trì một mô hình dữ liệu nhất quán và liên tục. Ý tưởng của anh ấy về cấu trúc dữ liệu trong bộ nhớ RAM RAM (SSD?) Ổn định của cả hai đều chậm và mở ra khả năng mất dữ liệu, thậm chí các DB NoQuery thường sử dụng nhật ký và cấu trúc dữ liệu bất biến để cập nhật các bản ghi liên tục một cách an toàn.
amon

3
@amon Vâng, Robert Harvey đúng khi đưa ra quan điểm khác biệt hơn. Nhưng vì OP đã hỏi cụ thể về những gì Robert C. Martin cố gắng nói nên tôi đã phiên âm một phần bài nói chuyện "mới hơn" của anh ấy.
Søren D. Ptæus

3
@amon - xem câu đầu tiên trong câu trả lời của Doc Brown ở trên. Martin thường xuyên đưa ra những tuyên bố là sự phóng đại lớn về quan điểm của mình để vượt qua nó. Anh ta không có nghĩa là tất cả các hoạt động cơ sở dữ liệu có thể được thay thế bằng các cửa hàng trong bộ nhớ, bất kể anh ta chỉ đơn giản là có một thành phần trong ứng dụng của bạn chạm vào SQL ở một dạng nào đó là một rủi ro bảo mật đủ lớn mà tất cả nên tránh trường hợp, nhưng trên khuôn mặt của lời nói của mình, ông có thể được giải thích như nói rằng. Nhưng tất cả những gì anh ấy thực sự cố gắng làm là khiến mọi người dừng lại và suy nghĩ: SQL / RDBMS có phù hợp với ứng dụng của tôi không?
Jules

12
@Jules Tôi hiểu rằng anh ấy thường phóng đại. Nhưng với tầm với và danh tiếng của mình, thật không ích lợi gì khi chú Bob Bob không nói rõ khi anh ta phóng đại và nơi anh ta thực sự nói những gì anh ta nói. Nếu anh ta định dạy một điều gì đó, thì không thể đoán được và diễn giải lại tất cả những gì anh ta nói cho đến khi nó có ý nghĩa , đặc biệt là khi anh ta không phản ánh hoặc tự phê bình ý tưởng của mình. Đến một lúc nào đó, nói dễ dàng hơn là đừng nghe anh ấy, hay thậm chí là: Chú Bob được coi là có hại .
amon

11

SQL là một chi tiết. Kiến thức về một chi tiết không nên lan truyền.

Vì SQL được sử dụng ở càng nhiều nơi trong mã của bạn, mã của bạn càng trở nên phụ thuộc vào nó.

Khi bạn tìm hiểu càng nhiều thủ thuật SQL, bạn sẽ giải quyết được nhiều vấn đề hơn bằng cách sử dụng SQL. Điều này có nghĩa là việc chuyển sang API khác để duy trì liên quan đến nhiều thứ hơn là chỉ dịch. Bạn phải giải quyết vấn đề mà bạn không nhận ra mình đã có.

Bạn chạy vào điều này thậm chí chuyển đổi giữa các cơ sở dữ liệu. Một cung cấp tính năng whizzbang 5 lạ mắt, do đó bạn chỉ sử dụng nó ở một số nơi để tìm hiểu tính năng whizzbang 5 là độc quyền và bây giờ bạn có vấn đề cấp phép sẽ tốn rất nhiều tiền. Vì vậy, bạn thực hiện rất nhiều công việc đào bới khắp mọi nơi bạn đã sử dụng tính năng 5 và tự mình giải quyết vấn đề để tìm hiểu sau này bạn cũng đang sử dụng tính năng whizzbang 3.

Một trong những điều làm cho Java trở nên di động là các tính năng nhất định của CPU không có sẵn. Nếu chúng có sẵn tôi sẽ sử dụng chúng. Và đột nhiên có CPU mà mã Java của tôi không hoạt động được vì chúng không có các tính năng đó. Nó giống với các tính năng cơ sở dữ liệu.

Đó là tất cả để dễ dàng hy sinh sự độc lập của bạn mà không nhận ra điều đó. SQL là một sự lựa chọn không phải là nhất định. Nếu bạn đưa ra quyết định sử dụng SQL thì hãy đặt nó ở một nơi. Làm cho nó theo một cách có thể được tạo ra.

Thực tế là SQL có vấn đề về bảo mật và việc chúng ta chuyển sang các mô hình bộ nhớ liên tục không có nghĩa là SQL sẽ bị tiêu diệt. Nó chỉ lái xe về nhà mà nó là một sự lựa chọn. Nếu bạn muốn giữ quyền lựa chọn đó, bạn phải thực hiện công việc.


Điều đáng chú ý là phong trào cơ sở dữ liệu của thập niên 80 và chú Bob có một lịch sử khá khó chịu. Anh ấy đã giải quyết tất cả các vấn đề của mình với một hệ thống tệp phẳng khi quản lý buộc một quản trị viên cơ sở dữ liệu vào cuộc sống của anh ấy. Sự kiện này đã đẩy anh ta vào sự nghiệp tư vấn xuất sắc của mình. (Anh ấy kể câu chuyện này trong một trong những cuốn sách đầu tiên của mình, quên đi) Anh ấy biết cách giải quyết vấn đề mà không cần DB và có chút kiên nhẫn cho những người hành động như sử dụng chúng là một điều được đưa ra.

Anh ta cũng kể một câu chuyện về việc tắt DB vào một ứng dụng cho đến phút cuối cùng khi khách hàng yêu cầu và thêm nó trong một ngày như một tính năng tùy chọn. Tôi đoán là anh ấy thấy cách mà hầu hết chúng ta sử dụng DB như một chứng nghiện. Anh ấy đang cố gắng chỉ cho chúng tôi cách từ bỏ thói quen.


1
Trời ạ, Einstein, tất nhiên.

1
À, không biết Einstein biết Bob. Hoặc rằng Bob là Chúa. Mặc dù có vẻ như nó có hình ảnh của một chút standup vui vẻ.
candied_orange

9
@nocomprende bạn sống với một chế độ ăn kiêng ổn định của áp phích động lực?
candied_orange

2
Nhưng Bob Chúa. Đối với một số ít nhất.
Peter Mortensen

3
Tôi từ chối tin rằng Chúa giỏi nói chuyện trước công chúng.
candied_orange

5

Trích dẫn từ trích dẫn đầu tiên của bạn là (nhấn mạnh của tôi),

Giải pháp. Giải pháp duy nhất. Là để loại bỏ SQL hoàn toàn khỏi hệ thống . Nếu không có công cụ SQL, thì không thể có các cuộc tấn công SQLi.

Điều gì sẽ thay thế SQL? Tất nhiên là có API! Và KHÔNG phải là API sử dụng ngôn ngữ văn bản. Thay vào đó, một API sử dụng một tập hợp các cấu trúc dữ liệu và lời gọi hàm thích hợp để truy cập dữ liệu cần thiết.

Các rant chống lại việc cho phép các lập trình viên ứng dụng sử dụng SQL.

Cách khắc phục được đề xuất là cho phép họ sử dụng API thay thế: đó không phải là SQL và không cho phép tiêm.

IMO, ví dụ về các API như vậy có thể bao gồm:

  • http://bobby-tables.com/csharp gợi ý các lập trình viên C # có thể sử dụng API ADO.NET.

    Đó không phải là một ví dụ hoàn hảo vì ADO.NET là API rộng hoặc sâu (nghĩa là mạnh mẽ hoặc có mục đích chung), cũng cho phép người dùng nhập SQL thô (hoặc raw-ish).

  • Một số nhà phát triển SQL hoặc quản trị viên cơ sở dữ liệu đề xuất rằng nên cấu hình cơ sở dữ liệu để nó chỉ cho phép truy cập thông qua (một số lượng hạn chế các thủ tục được lưu trữ chuyên nghiệp) và các nhà phát triển ứng dụng không được phép viết các truy vấn SQL (nguy hiểm) của riêng họ

  • Một cách khác để "loại bỏ SQL khỏi hệ thống" là đặt cơ sở dữ liệu (hiển thị SQL) trên một số hệ thống khác , được truy cập thông qua API REST hoặc tương tự.

Vì vậy, IMO, giải pháp tổng thể hoặc hệ thống vẫn có thể sử dụng cơ sở dữ liệu (đặc biệt là khi một công cụ cơ sở dữ liệu thực hiện các thuộc tính ACID hữu ích và có quy mô tốt, v.v., có thể thật ngu ngốc khi cố gắng làm mà không cần hoặc viết một ứng dụng dành riêng cho ứng dụng).

Các yêu cầu của rant được thỏa mãn nếu API SQL của cơ sở dữ liệu bị ẩn khỏi các nhà phát triển ứng dụng, đằng sau một số API khác (ví dụ: ADO, có lẽ là ORM, dịch vụ Web hoặc bất cứ điều gì).

Nói chung, tôi cho rằng nó có nghĩa là có một DAL dành riêng cho ứng dụng ("lớp truy cập dữ liệu" hoặc "lớp trừu tượng hóa cơ sở dữ liệu"). Một DAL cách ly ứng dụng khỏi các chi tiết về cách thức và nơi dữ liệu được lưu trữ và / hoặc tìm nạp. DAL có thể hoặc không thể được thực hiện bằng cơ sở dữ liệu SQL.


Tôi đã làm việc trên một sản phẩm đã làm chính xác 30 năm trước. Và, cơ sở dữ liệu cơ bản thậm chí không hỗ trợ SQL (chưa). Và, tập hợp các bảng có liên quan đã được lưu trữ trong (chờ cho nó ...) một cơ sở dữ liệu. Người đã nghĩ ra điều đó thực sự thông minh. Không còn là một lập trình viên mặc dù.

Tôi thích câu trả lời này nhưng tôi nghĩ anh ấy có thể không nói điều này. Ông cũng nói, "Các khung không xử lý vấn đề ...". Từ câu trả lời của bạn, có vẻ như bạn đang nói sử dụng Linq-to-Sql là được nhưng đó không phải là một khung xử lý vấn đề?
christo8989

@ christo8989 Tôi không biết. Ông đề cập đến Hibernate như một ví dụ về một khung không xử lý vấn đề này. Và thực tế, OWASP nói , "Hibernate không cấp quyền miễn dịch đối với SQL Injection, người ta có thể sử dụng sai api khi họ muốn. Không có gì đặc biệt về HQL (tập hợp con Hibernates của SQL) khiến nó trở nên dễ bị ảnh hưởng hơn." Trong khi đó một số API tôi đã đề cập sẽ là cách điện tốt hơn, hoàn toàn không làm lộ SQL. Có thể Hibernate là thứ bạn có thể sử dụng để triển khai DAL (nhưng bản thân nó không phải là DAL cách điện hoàn toàn).
ChrisW

1
@ christo8989 augustl.com/blog/2016/... gợi ý rằng Datomic là (chỉ) một wrapper / lớp xung quanh (có thể-SQL) cơ sở dữ liệu - "Datomic không ghi trực tiếp vào hệ thống tập tin Thay vào đó, bạn có thể sử dụng một số. của các cơ sở dữ liệu khác nhau như một phụ trợ lưu trữ cho Datomic: Bất kỳ cơ sở dữ liệu JDBC SQL nào, v.v. "
ChrisW

Cần lưu ý rằng giải pháp tránh SQL tiêm trong ADO.NET không quá phức tạp - sử dụng trình giữ chỗ trong SQL, sử dụng tham số trong lệnh và đặt giá trị của các tham số đã nói.
Zev Spitz

3

Mọi người dường như đang trả lời câu hỏi này từ quan điểm bảo mật hoặc với ống kính SQL.

Tôi thấy một bài giảng của Robert Martin nơi ông kể lại rằng là các lập trình viên, chúng tôi sử dụng nhiều cấu trúc dữ liệu khác nhau tối ưu cho các chương trình cụ thể của chúng tôi. Vì vậy, thay vì lưu trữ phổ biến tất cả dữ liệu trong cấu trúc bảng, chúng ta nên lưu trữ dữ liệu của mình trong bảng băm, cây, v.v để có thể lấy dữ liệu và nhảy ngay vào chương trình.

Tôi giải thích thông điệp của anh ấy khi chỉ nói rằng chúng ta nên đưa ra các giả định hiện tại về việc lưu trữ liên tục trong giây lát để xem xét các khả năng khác trong tương lai so với định dạng bảng SQL cũ. SSD là một giải pháp ứng cử viên, nhưng không phải là giải pháp duy nhất.


Anh ta có thể nghĩ gì về việc đọc / ghi dữ liệu đồng thời của nhiều người dùng?
ChrisW

1
@ChrisW Tôi không nghĩ đây là vấn đề triển khai, thay vào đó là một ý tưởng cấp cao về việc tìm cách lưu trữ dữ liệu liên tục tốt hơn.
Keenan

@ChrisW Ông cũng nói về cơ sở dữ liệu giao dịch. Đưa công nghệ kiểm soát nguồn làm công cụ kiên trì của bạn. Trong đó, bạn chỉ tạo và đọc thân thiện đồng thời hơn nhiều so với các giao dịch và cập nhật.
christo8989

@Keenan Vì vậy, anh ấy không thực sự cung cấp một giải pháp thông qua thực hiện. Anh ấy chỉ nói, nghĩ về những gì có thể?
christo8989

1
@ christo8989 Cho dù anh ta có đích thân dẫn đầu về việc phá hủy các giải pháp ứng cử viên cho vấn đề lưu trữ liên tục trong khoa học máy tính, tôi không biết. Điều đó nằm ngoài phạm vi câu hỏi của OP. Chú Bob là tất cả về kiến ​​trúc plug-in. Tiêu chuẩn phát triển ứng dụng hiện tại của ngành là kết hợp chặt chẽ với cơ sở dữ liệu và xây dựng ứng dụng xung quanh nó, ứng dụng phụ thuộc vào db, khi db nên phụ thuộc vào ứng dụng. Thay vào đó, chú Bob đề xuất rằng 'cơ sở dữ liệu là một chi tiết' và nên được tách rời và thay thế.
Keenan

2

Trên thực tế, anh ta không sử dụng cơ sở dữ liệu và SQL - khá rõ ràng. Tài liệu tham khảo đầu tiên là một vấn đề được biết rõ, tài liệu tham khảo thứ hai phát ra âm thanh như một lời ca ngợi. Mặc dù, tôi đang giải thích nó là có lý do chính đáng để sử dụng cơ sở dữ liệu và không sử dụng SQL. Từ quan điểm của tôi điều này thậm chí không phải là lời khuyên hợp lý.

Thật không may, ví dụ anh ta đang sử dụng là một ví dụ nổi tiếng với một giải pháp nổi tiếng mà sau đó anh ta chỉ ra. Nó thường xuất hiện khi một lập trình viên không nhận ra mình đang làm gì. Ví dụ: xây dựng các chuỗi chứa SQL như:

    my $sql="select a from b where a=$ui_val;";
    prepare($sql)
    execute($sql)

như trái ngược với

    my $sql="select a from b where a=?;";
    prepare($sql)
    execute($sql,$ui_val);

Đây là một ví dụ DBI perl cho mã ruby ​​trên đường ray. Mã đường ray mà anh ta cung cấp rất dễ nhầm lẫn giữa an toàn và không an toàn. Giống như nhiều ORM ẩn những gì SQL bên dưới và thường thì bạn đang xử lý một giao diện xây dựng và thực thi sql cho bạn. Điều này có giống như những gì API sẽ làm cho bạn không?

Giải thích của tôi về tài liệu tham khảo đầu tiên là ông đang gợi ý rằng chúng ta nên thay thế một vấn đề nổi tiếng có giải pháp nổi tiếng.

Thật không may là anh ta không đề cập rằng nếu điều này được thực hiện một cách chính xác, nó sẽ làm cho mã dễ viết hơn và dễ đọc hơn, mặc dù nếu nó được thực hiện tốt, nó thực sự có thể khó viết hơn và khó đọc hơn. Ngoài ra, ông không đề cập đến việc SQL thực sự rất dễ đọc và làm những gì bạn thường mong đợi nó sẽ làm.

Anh ta đúng một phần, cuối cùng chúng ta sẽ có một bộ nhớ lớn và nhanh vô hạn và một bộ xử lý cực kỳ nhanh. Cho đến khi chúng tôi thoát ra khỏi vật lý hiện tại hạn chế tính toán, anh ta không đúng.

Có đĩa quay là một điều của quá khứ, và bây giờ chúng tôi sử dụng SSD. Đĩa hoạt động với khoảng ~ 10 mili giây mỗi lần truyền dữ liệu, SSD hoạt động với thời gian truy cập dữ liệu ~ 0,5 mili giây (500 microsec). RAM ở mức 100 nano giây, bộ xử lý hoạt động với tốc độ 100 giây pico giây. Đây là trung tâm của lý do tại sao chúng ta cần cơ sở dữ liệu. Cơ sở dữ liệu quản lý việc truyền dữ liệu giữa các đĩa quay hoặc SSD với bộ nhớ chính. Sự ra đời của SSD chưa loại bỏ nhu cầu về cơ sở dữ liệu.


4
"DỪNG SỬ DỤNG SQL" (được trích dẫn từ liên kết đầu tiên) nghe có vẻ rất giống như anh ta đang nói không sử dụng SQL, theo sự hiểu biết của tôi.
Doc Brown

6
Đây là một vấn đề trật tự từ. Trên thực tế, đây ban đầu là một bức điện tín: SỬ DỤNG SQL STOP

6
@nocomprende Vậy bạn có nói rằng anh ấy là nạn nhân của tình trạng chủng tộc không? Vâng, rất tiếc. Anh ta có thể tránh điều đó bằng cách sử dụng các giao dịch SQL.
Konrad Rudolph

Có lẽ nó là một hỗn hợp rất ngắn của Visual Basic và Fortran. Tất cả sẽ kết thúc ở đâu?

1
@KonradRudolph: Chà, tôi nghĩ rằng chúng tôi sẽ đồng ý rằng hầu như không có ai sẽ sử dụng TSX trực tiếp từ lắp ráp. Sẽ có sự trừu tượng ở cấp độ cao hơn. Những giao dịch trừu tượng đó có phải là giao dịch SQL không? Tôi nghĩ là không. Là một ngôn ngữ được giải thích, SQL mang một chi phí hiệu năng. Điều đó thực sự không quan trọng khi bạn truy cập dữ liệu trên các ổ cứng quay. Tuy nhiên, không thể truy cập dữ liệu trong RAM.
MSalters

2

Câu trả lời

Có phải anh ta chỉ muốn mọi người ngừng sử dụng Cơ sở dữ liệu SQL / Quan hệ vì các cuộc tấn công SQLi?

Bài viết 'Bảng Bobby' dường như gợi ý rằng, điều này và chính nó là một lý do để không sử dụng SQL:

Giải pháp. Giải pháp duy nhất. Là để loại bỏ SQL hoàn toàn khỏi hệ thống. Nếu không có công cụ SQL, thì không thể có các cuộc tấn công SQLi.

Anh ta có thể có những lý do khác mà anh ta thảo luận ở nơi khác. Tôi không biết vì tôi không thực sự đọc nhiều thứ của anh ấy.

Giải mã

Phần này không thực sự là một câu trả lời, nhưng tôi nghĩ rằng câu hỏi về giá trị của SQL thú vị hơn nhiều (cũng như những người khác, rõ ràng.)

Tôi đã có nhiều kinh nghiệm sử dụng SQL và tôi nghĩ rằng tôi hiểu rõ về điểm mạnh và điểm yếu của nó. Cảm nhận cá nhân của tôi là nó đã bị lạm dụng và lạm dụng, nhưng ý tưởng rằng chúng ta không bao giờ nên sử dụng nó là loại ngớ ngẩn. Ý tưởng rằng chúng ta phải chọn 'SQL luôn' hoặc 'SQL không bao giờ' là một sự phân đôi sai.

Theo như SQL tiêm là một đối số cho việc không sử dụng SQL, điều đó thật buồn cười. Đây là một vấn đề được hiểu rõ với một giải pháp khá đơn giản. Vấn đề với lập luận này là SQLi không phải là lỗ hổng duy nhất tồn tại. Nếu bạn nghĩ rằng việc sử dụng API JSON làm cho bạn an toàn, bạn sẽ gặp bất ngờ lớn.

Tôi nghĩ rằng mọi nhà phát triển nên xem video này có tiêu đề "Thứ sáu ngày 13: Tấn công JSON - Alvaro Muñoz & Oleksandr Mirosh - AppSecUSA 2017"

Nếu bạn không có thời gian hoặc thiên hướng để xem qua nó, thì đây là ý chính: Rất nhiều thư viện giải nén JSON có các lỗ hổng thực thi mã từ xa. Nếu bạn đang sử dụng XML, bạn còn phải lo lắng nhiều hơn nữa. Cấm SQL từ kiến ​​trúc của bạn sẽ không làm cho hệ thống của bạn an toàn.


Không ai tuyên bố rằng việc cấm SQL tự nó sẽ làm cho hệ thống của bạn an toàn. Chú Bob tuyên bố rằng nó làm cho hệ thống của bạn an toàn hơn và do SQL tiêm vẫn là rủi ro lớn nhất trong bảo mật ứng dụng web trong hơn một thập kỷ nay, tôi nghĩ bạn không nên bỏ qua nhu cầu của ngành để cải thiện cách thức nói chuyện với cơ sở dữ liệu .
meriton - đình công

@meriton Xin lỗi, nhưng "giải pháp, giải pháp duy nhất" có vẻ khá rõ ràng. Giải pháp cho vấn đề của SQLi được biết đến và khá đơn giản. Những người không thể bị làm phiền khi sử dụng các câu lệnh chuẩn bị sẽ tạo ra các hệ thống không an toàn bất kể họ có ngừng sử dụng SQL hay không. Đây là những người không chuyên nghiệp, cần bắt đầu tuân theo các thực hành tốt cơ bản hoặc nhận một công việc mới.
JimmyJames

2

Tôi chỉ muốn giải quyết một tuyên bố ngắn:

Hay anh ta chỉ muốn mọi người ngừng sử dụng Cơ sở dữ liệu SQL / Quan hệ vì các cuộc tấn công SQLi?

Không. Đó là một giả định sai. Chúng tôi không thể nói rằng chúng tôi phải ngừng sử dụng xe hơi, bởi vì họ chịu trách nhiệm về những người chết vì tai nạn xe hơi. Theo cùng một cách, các cơ sở dữ liệu SQL / quan hệ (hoặc bất cứ thứ gì khác trong ngữ cảnh này, chẳng hạn như RDBMS) không chịu trách nhiệm đối với tải trọng SQL độc hại mà kẻ tấn công có thể thực hiện trên ứng dụng web của bạn. Tôi chắc chắn rằng tác giả không có ý đó, bởi vì có toàn bộ bảng cheat ngăn chặn tiêm SQL cho mục đích này.


2
Ô tô tự động sẽ ngăn ngừa khoảng 98% tai nạn xe hơi. Chúng ta cần tin tưởng vào máy nhiều hơn , heh heh.

3
Chúng tôi không thể nói rằng chúng tôi phải ngừng sử dụng ô tô [ngoại trừ các trường hợp đặc biệt và / hoặc được kiểm soát cẩn thận] bởi vì họ chịu trách nhiệm về những người chết trong các vụ tai nạn xe hơi. Chúng tôi hoàn toàn có thể nói rằng. Và nhiều người hợp lý làm.
Konrad Rudolph

1
Về cơ bản, bạn đang nói: Một ứng dụng được phát triển bằng Java đã bị hack nên chúng ta phải ngừng sử dụng Java . Downvote là đủ và đối với phần còn lại, tôi không ở đây để dạy cho bạn ý thức chung. @KonradRudolph
Billal Begueradj

2
@BillalBEGUERADJ Đó là một sự tương đương sai (vì không có gì an toàn khi hack) nhưng nó cũng không hoàn toàn xa vời: có những ngôn ngữ, trên sự cân bằng, không nên được sử dụng vì có những lựa chọn thay thế tốt hơn; ví dụ, nếu bạn đang sử dụng C ngoài bối cảnh lập trình hệ thống, bạn đang làm sai. Dù sao, tôi đã không đánh giá thấp câu trả lời của bạn nhưng điều đó sai: bởi vì trái với những gì bạn tuyên bố, đó chính xác là những gì Bob Martin đang nói (như các câu trả lời khác cho thấy).
Konrad Rudolph

2

Vấn đề của Martin dường như là với các lập trình viên xây dựng SQL động trực tiếp từ đầu vào của người dùng, đại loại như (tha thứ cho tôi, tôi chủ yếu là lập trình viên C và C ++):

sprintf( query, "select foo from bar where %s;", user_input );

đó hoàn toàn là một công thức cho chứng ợ nóng (do đó là dải Bobby Bảng ). Bất kỳ lập trình viên nào đặt mã như thế trong một hệ thống sản xuất đều xứng đáng là một paddlin '.

Bạn có thể giảm thiểu (nếu không loại bỏ hoàn toàn) vấn đề bằng cách sử dụng các tuyên bố đã chuẩn bị và vệ sinh đúng cách các đầu vào của bạn. Nếu bạn có thể ẩn SQL đằng sau một API để các lập trình viên không trực tiếp xây dựng các chuỗi truy vấn, thì càng tốt (đó là một phần của những gì Martin ủng hộ).

Nhưng để loại bỏ hoàn toàn SQL, tôi không nghĩ đó là thực tế hay mong muốn. Các mô hình quan hệ rất hữu ích , đó là lý do tại sao chúng tồn tại ở vị trí đầu tiên và SQL có lẽ là giao diện tốt nhất để làm việc với các mô hình quan hệ.

Như mọi khi, đó là vấn đề sử dụng công cụ phù hợp cho công việc. Nếu ứng dụng giỏ hàng của bạn không cần mô hình quan hệ đầy đủ, thì đừng sử dụng mô hình quan hệ (có nghĩa là bạn sẽ không cần sử dụng SQL). Đối với những lần bạn cần một mô hình quan hệ, thì bạn gần như chắc chắn sẽ làm việc với SQL.


Mặc dù sprintfkhông chứa loại khử trùng mà SQL yêu cầu, các chức năng được thiết kế dành riêng cho mục đích này thực hiện và hoàn toàn an toàn. Ví dụ: SqlQuery trong Entity Framework .
Robert Harvey

@RobertHarvey: Tôi sẽ cho rằng đó là trường hợp. Về phần tôi, tôi chủ yếu làm công việc phía máy chủ trong C và C ++, vì vậy tôi vẫn thỉnh thoảng thấy các ví dụ (rất may là hiếm) về những người chỉ sử dụng sprintfSQL động, đó không phải là cách bạn làm.
John Bode

1

Hai nguồn bạn liên kết truyền tải các thông điệp khác nhau:

Bài đăng trên blog nói rằng logic truy cập dữ liệu không nên tồn tại dưới dạng văn bản trong thời gian chạy, vì sợ rằng nó sẽ bị trộn lẫn với đầu vào của người dùng không đáng tin cậy. Đó là, bài viết trên blog lên án các truy vấn bằng cách nối các chuỗi.

Bài giảng thì khác. Sự khác biệt đầu tiên là về giọng điệu: Bài giảng suy đoán và gọi vào câu hỏi, nhưng không lên án. Anh ta không nói rằng cơ sở dữ liệu là xấu, nhưng thách thức chúng ta tưởng tượng sự bền bỉ mà không có cơ sở dữ liệu. Ông lập luận rằng trong 30 năm kể từ khi cơ sở dữ liệu quan hệ trở nên phổ biến, nhiều thứ đã thay đổi và nổi bật là hai thứ có thể ảnh hưởng đến sự lựa chọn công nghệ bền bỉ của chúng tôi:

  • dung lượng lưu trữ đã tăng thêm khoảng 1 triệu - với mức giá tương đương! Do đó, việc bảo tồn lưu trữ là ít cần thiết hơn và đặc biệt, không còn cần thiết phải xóa. Bằng cách sử dụng lưu trữ chỉ chắp thêm, kiểm soát đồng thời có thể được đơn giản hóa vì khóa đọc là không cần thiết. Điều này có thể làm giảm nhu cầu giao dịch.
  • thời gian truy cập đã giảm, vì hầu hết các bộ dữ liệu hiện nay đều phù hợp với RAM, giúp giảm đáng kể độ trễ đọc.

Những hoàn cảnh thay đổi này có làm thay đổi công nghệ kiên trì tối ưu không? Thật thú vị, chú Bob không nói - có lẽ bởi vì ông cảm thấy không có câu trả lời nào là đúng cho tất cả các chương trình. Đó là lý do tại sao anh ấy cảnh báo chúng tôi coi sự lựa chọn của chúng tôi về công nghệ bền bỉ như một chi tiết thay vì bảo quản nó thành những phiến đá và truyền lại nó như là sự khôn ngoan nhận được cho các đồng nghiệp của chúng tôi.

Có sự thay thế tồn tại?

Viết logic truy cập dữ liệu mà không có chuỗi là hoàn toàn có thể. Trong vùng đất Java, bạn có thể sử dụng QueryDSL , trong đó các truy vấn được mô tả bằng API thông thạo an toàn loại được tạo từ lược đồ cơ sở dữ liệu của bạn. Một truy vấn như vậy có thể trông như sau:

JPAQuery<?> query = new JPAQuery<Void>(entityManager);
Customer bob = query.select(customer)
  .from(customer)
  .where(customer.firstName.eq("Bob"))
  .fetchOne();

Như bạn có thể thấy, logic truy vấn không được biểu thị dưới dạng Chuỗi, phân tách rõ ràng cấu trúc tin cậy của truy vấn khỏi các tham số không đáng tin cậy (và tất nhiên, QueryDSL không bao giờ bao gồm các tham số vào văn bản truy vấn, nhưng sử dụng các câu lệnh được chuẩn bị để phân tách truy vấn cho các tham số của nó ở mức JDBC). Để đạt được SQL SQL với QueryDSL, bạn phải viết trình phân tích cú pháp của riêng mình để phân tích một chuỗi và dịch nó thành một cây cú pháp và ngay cả khi bạn đã làm điều đó, có lẽ bạn sẽ không thêm hỗ trợ cho những thứ khó chịu như select ... into file. Nói tóm lại, QueryDSL làm cho việc tiêm SQL không thể thực hiện được, đồng thời cũng cải thiện năng suất của lập trình viên và tăng khả năng tái cấu trúc an toàn. Ngăn chặn rủi ro lớn nhất đối với bảo mật ứng dụng web, đã tồn tại đủ lâu để sinh ra các trò đùa đang chạyvà tăng năng suất của nhà phát triển? Tôi dám nói rằng nếu bạn vẫn viết các truy vấn dưới dạng chuỗi, bạn đang làm sai.

Đối với các lựa chọn thay thế cho các cơ sở dữ liệu quan hệ, thật tò mò khi biết rằng kiểm soát đồng thời đa phiên bản của postgres chính xác là loại cấu trúc dữ liệu chỉ có phụ lục mà chú Bob đang nói đến, mặc dù có lẽ ông đang nghĩ nhiều hơn về các cửa hàng sự kiệnnguồn cung cấp sự kiện mô hình nói chung, cũng phù hợp độc đáo với khái niệm giữ trạng thái hiện tại trong RAM.

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.