Trừu tượng hóa cơ sở dữ liệu - nó đang bị quá tải?


18

Sau khi tiếp xúc với nhiều lớp trừu tượng cơ sở dữ liệu, tôi bắt đầu tự hỏi điểm nào của mỗi thư viện phát minh ra mô hình khác nhau của riêng họ để truy cập dữ liệu. Nhặt một DAL mới có cảm giác như học lại một ngôn ngữ mới, khi mà tất cả những gì tôi muốn làm chỉ là thuyết phục lớp đưa ra một truy vấn SQL mà tôi đã viết trong đầu.

Và đó thậm chí không chạm vào khả năng đọc sau khi thực tế:

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

Có gì sai với cú pháp SQL chuẩn? Nó được tạo ra cho một mục đích cụ thể, và nó phù hợp với mục đích đó một cách tuyệt đẹp. Có lẽ đó chỉ là tôi, nhưng tôi hiểu đoạn trích C dễ dàng hơn nhiều so với hai đoạn đầu. Các từ khóa được đổi tên và các thủ thuật cú pháp rất dễ thương, nhưng IMO, khi nói đến nó, chúng không giúp việc lấy hàng trở nên dễ dàng hơn cho người viết mã.

Điều này có lẽ dường như là một rant dài, nhưng có một câu hỏi thực sự ở đây. Vì mọi DAL dường như phát minh ra DSL mới cho các truy vấn thay vì chỉ phân tích cú pháp SQL đã thử và đúng, nên phải có các lợi ích của việc sử dụng cú pháp khác nhau hoặc thiếu sót trong cú pháp SQL tiêu chuẩn mà tôi không nhận ra là có. Bất cứ ai có thể xin vui lòng chỉ ra những gì tôi đang xem ở đây?


2
Vấn đề lớn nhất với SQL chuẩn là có một số truy vấn dành riêng cho cơ sở dữ liệu. Cú pháp nối ngoài thay đổi rất nhiều, cũng như quá trình nhận truy vấn "cửa sổ". Đó là nhu cầu bắt đầu với DALs. Bây giờ, nếu có một biến thể tiêu chuẩn của SQL được DAL sử dụng để biết cách xử lý các thành ngữ của các nhà cung cấp SQL khác nhau, tôi sẽ hoan nghênh điều đó.
Berin Loritsch

Câu trả lời:


10

Vấn đề cơ bản nhất của việc sử dụng SQL phổ biến là, các truy vấn SQL là các chuỗi, được tạo thành từ một ngôn ngữ khác. Đây là nơi SQL tiêm và các lỗ hổng khác và WTF xuất phát (ví dụ của bạn được chọn khá kém, vì truy vấn của bạn không thực sự có bất kỳ tham số nào).

Vấn đề tiếp theo thực sự là một hệ quả: nếu bạn chỉ có một số SQL được viết trong mã của mình, trình biên dịch không thể làm bất cứ điều gì về nó. Các lỗi như lỗi chính tả trong tên cột sẽ chỉ xuất hiện khi chạy. Về cơ bản, đây là lý do tại sao bạn không muốn chỉ một chuỗi đại diện cho truy vấn của mình trong mã nguồn của mình, nhưng một cái gì đó trình biên dịch có thể phân tích tĩnh để ngăn chặn 95% tất cả các lỗi facepalm.

Và vấn đề cuối cùng xảy ra, khi bạn cố gắng ánh xạ cơ sở dữ liệu quan hệ đến mô hình lập trình và ngữ nghĩa ngôn ngữ của mình: RDBMS không kết hợp tốt với OOP (hoặc truy xuất dữ liệu điều hướng). Trên thực tế, đây là một ý tưởng khá tồi tệ khi kết hợp cả hai, nhưng đó là tất cả những gì DAL hướng đối tượng cho cơ sở dữ liệu SQL (tức là ORM). Nhưng tất cả các lớp trừu tượng này bị lên án để rò rỉ. Tôi nghĩ rằng về cơ bản đây là lý do tại sao có rất nhiều người trong số họ: Bởi vì bạn làm việc với họ, bạn thấy họ thật thiếu sót, bạn đã bắt đầu viết một DAL thực hiện đúng và cuối cùng thất bại.

Vì vậy, trong khi các vấn đề một và hai đề xuất để có các DAL loại bỏ SQL, thì vấn đề thứ ba ngụ ý rằng không có giải pháp thẳng thắn nào về việc có một (ít nhất là cho OOP) và do đó sẽ luôn có một biển DAL với các điểm mạnh và hạn chế khác nhau. Cuối cùng, tất cả những gì bạn có thể làm là cẩn thận chọn một vài cái và bám lấy chúng.


3
"RDBMS không kết hợp tốt với OOP" - Có phải mọi thứ trong phần mềm đều phải là OO?
quant_dev

@quant_dev: Không. Nhưng "các lớp trừu tượng" vốn ít nhất là "định hướng trừu tượng hóa". Ngoài ra các đoạn mã được cung cấp gợi ý, rằng chúng ta đang nói về mã OO.
back2dos

Tôi luôn nghĩ rằng việc nhúng SQL vào C hoặc bất cứ điều gì chỉ là điều ngu ngốc nhất có thể tưởng tượng được. Khi tôi phải làm một cái gì đó tương tự, tôi đã tạo ra một phương tiện xác định mối quan hệ giữa các bảng và lưu trữ nó trong cơ sở dữ liệu và sau đó sử dụng các mối quan hệ ở đó để tạo SQL trong thời gian chạy để nói chuyện với cơ sở dữ liệu. Mã C của tôi chỉ là: "Tìm thực thể này bằng khóa này", "Lưu các thay đổi cho nó".

9

Bạn đang nhìn vào một thực tế rõ ràng rằng không phải tất cả các nền tảng cơ sở dữ liệu đều chấp nhận cùng một cú pháp SQL, do đó, việc nhúng các câu lệnh SQL trong ứng dụng của bạn sẽ không hoạt động cho mọi nền tảng cơ sở dữ liệu. Nếu bạn cần hỗ trợ nhiều nền tảng cơ sở dữ liệu, bạn sẽ phải suy nghĩ lại hầu hết (nếu không phải tất cả) các câu lệnh SQL này.


3
@ Chú ý - Nhưng sau đó DAL sẽ phải có một trình phân tích cú pháp SQL đầy đủ và nó sẽ phải có phương ngữ được hỗ trợ riêng, nó sẽ khác với bất kỳ cơ sở dữ liệu cụ thể nào. Và sau đó nó sẽ có tất cả sự phức tạp mà nó hiện có để tạo ra một câu lệnh SQL dành riêng cho cơ sở dữ liệu. Ví dụ, từ khóa LIMIT trong ví dụ của bạn là hợp lệ trong MySQL nhưng không phải trong Oracle hoặc SQL Server.
Hang Justin

2
Bây giờ chúng ta đang đi vào phần cốt lõi của câu hỏi. Điều gì làm cho một tập hợp các tên phương thức và toán tử quá tải vượt trội so với một phương ngữ không chuẩn của SQL? Sử dụng SQL ít nhất sẽ cung cấp cho bộ mã hóa một nền tảng quen thuộc để bắt đầu học khung từ đó.
Lưu ý đến bản thân - nghĩ về một cái tên

3
@ Chú ý đến bản thân: có lẽ vì viết API kiểu thông thạo dễ hơn viết một trình phân tích cú pháp SQL theo một số phương ngữ của SQL và sau đó dịch nó sang một số phương ngữ khác của SQL.
Dean Harding

1
Đối với bản ghi, tôi cũng thích sử dụng SQL "gốc". Hầu hết các dự án của tôi chưa bao giờ cần hỗ trợ nhiều hơn một cơ sở dữ liệu, vì vậy nó không bao giờ là vấn đề đối với tôi.
Dean Harding

3
"Bạn đang xem xét một thực tế rõ ràng rằng không phải tất cả các nền tảng cơ sở dữ liệu đều chấp nhận cùng một cú pháp SQL" - vâng, nhưng bạn có thường xuyên viết mã để chạy với bất kỳ cơ sở dữ liệu nào không? Thông thường một nền tảng DB là một khoản đầu tư đáng kể và không thường xuyên thay đổi. Ngoài ra, có những hiệu quả đáng kể được thực hiện từ việc tối ưu hóa các truy vấn của bạn đối với một loại cơ sở dữ liệu đã biết.
quant_dev

5

Tôi cảm thấy như SQL đang trải qua sự thay đổi lớn tương tự con trỏ cách đây 10 năm. Có một nỗ lực liên tục để loại bỏ công việc thủ công với SQL và đưa nó lên mức độ trừu tượng cao hơn. Điều tương tự cũng xảy ra với con trỏ và quản lý bộ nhớ thủ công từ nhiều năm trước.

Vì công việc hiện đang được tiến hành, bạn thích nhìn thấy nhiều cách tiếp cận khác nhau được đề xuất, thử, từ bỏ và tích hợp. Tôi chắc rằng chúng ta sẽ thấy nhiều hơn về nó trước một cách tiếp cận chung hoặc một tiêu chuẩn ngành nếu bạn muốn thể hiện chính nó.

Nó chắc chắn mang lại cho bạn một lợi thế khi bạn có thể thao tác mã truy cập dữ liệu ở cùng cấp độ và với cùng một mô hình bạn áp dụng khi làm việc với mã ứng dụng của bạn.

Trong một vài từ - đơn giản hóa, nhanh nhẹn, nhanh chóng, đây là những mục tiêu.


4

Joel đã viết một bài báo hay cách đây 10 năm: Đừng để các phi hành gia kiến ​​trúc sợ bạn

Tôi nghĩ đó chính xác là trường hợp. Tôi đã sử dụng lớp trừu tượng trong các ứng dụng của riêng mình kể từ khi tôi tìm thấy một mẫu và tôi dễ dàng thực hiện theo cách này. Nhưng đó là DAL của tôi, tôi biết từng dòng trong mã nguồn => toàn quyền kiểm soát. Nhưng tôi sẽ không đề xuất sử dụng khuôn khổ đó cho bất kỳ ai ngoài nhóm / dự án của tôi.

Khi bạn sử dụng một cái gì đó tương tự, điều quan trọng là phải biết cách triển khai, điều đó có nghĩa là bạn nên dành nhiều thời gian để học thư viện / công cụ. Nếu bạn không có thời gian để học nó - đừng sử dụng. Ngay cả khi nó trông rất dễ dàng ngay từ đầu.


Vâng, một công ty tôi làm việc trong quá khứ đã bắt đầu sử dụng Hibernate một cách nhiệt tình. Sau đó, họ phát hiện ra mức độ đáng ngạc nhiên (một cách kỳ lạ) các truy vấn được tạo bởi khung công tác có thể như thế nào.
quant_dev

@quant_dev Vâng, đó là cái bẫy - thật dễ dàng để bắt đầu làm những việc đơn giản với Hibernate hoặc JPA.
m5ba
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.