Sau một thời gian không viết bài mới cho blog, mình bắt đầu quay trở lại. Lần mò trong đống bài viết nháp, sau một hồi cân đo đong đếm :)). Mình quyết định viết bài đưa ra quan điểm cá nhân về vấn đề “Nên viết SQL ở đâu? Stored Procedures hay tầng ứng dụng”. Đây là một chủ đề đã khá là cũ, tuy nhiên không phải ai cũng hiểu rõ tường tận 2 trường phái này.

Mục đích của bài viết là chỉ ra ưu điểm, nhược điểm, đồng thời đưa ra quan điểm cá nhân về 2 trường phái trên. Từ đó, bạn có thể vận dụng tùy thuộc vào từng dự án để lựa chọn cách tiếp cận cho phù hợp.

Viết SQL trong Stored Procedures

Hiểu đơn giản, đây là cách mà bạn sẽ tạo các stored procedures và viết SQL trong các stored procedures. Tầng ứng dụng sẽ gọi các stored procedures thay vì gọi thực thi các SQL một cách trực tiếp.

Ưu điểm:

– Tăng tốc độ thực thi câu lệnh SQL: Stored Procedures sẽ được biên dịch và lưu trữ ngay trong cơ sở dữ liệu, các câu lệnh SQL cũng sẽ được tối ưu. Do đó, tốc độ thực thi sẽ cao hơn so với khi viết SQL trên tầng ứng dụng.

– Bảo mật tốt hơn:

  • Chống SQL Injection: Việc viết SQL ngay trên tầng ứng dụng, nếu không cẩn thận thì rất dễ dính phải lỗ hổng SQL Injection. Kẻ xấu có thể lợi dụng điều đó để phá hoại, tấn công vào hệ thống.
  • Phân quyền: Viết SQL trên tầng ứng dụng, thì user được dùng để kết nối CSDL sẽ thường có các quyền SELECT/INSERT/UPDATE/DELETE vào các bảng. Nếu hacker chiếm được quyền truy cập vào cơ sở dữ liệu với user trên, thì lúc đó dữ liệu của bạn có nguy cơ bay màu. Khi dùng stored procedures, user sẽ không cần bất cứ quyền trực tiếp nào trên các bảng. User chỉ cần có quyền thực thi stored procedures và khi stored procedures thực thi sẽ thao tác trên các bảng cho user.
  • Stored Procedures có thể được mã hóa để tăng cường tính bảo mật.

– Tính tái sử dụng: Trong một chương trình, có những trường hợp các đoạn SQL được viết đi viết lại nhiều lần, điều này dẫn đến tình trạng lặp lại code. Viết SQL trong Stored Procedures giúp giải quyết vấn đề này bằng cách cho phép tầng ứng dụng gọi trực tiếp đến stored procedure. Điều này giúp tầng ứng dụng tránh được lặp lại code. Ngoài ra, khi cần sửa đổi, chỉ cần sửa lại stored procedure mà không ảnh hưởng tới tầng ứng dụng.

– Giảm thiểu lỗi logic: Khi viết SQL trong stored procedures, bạn có thể kiểm tra, xác thực dữ liệu trước khi thực thi. Từ đó giảm thiểu tình trạng gặp lỗi logic và đảm bảo tính nhất quán của dữ liệu.

– Giảm tải giữa tầng ứng dụng và cơ sở dữ liệu: Một chức năng có thể yêu cầu nhiều truy vấn, việc thực hiện nhiều truy vấn trong tầng ứng dụng có thể dẫn đến việc truyền dữ liệu quá nhiều giữa tầng ứng dụng và cơ sở dữ liệu. Vô hình trung ảnh hưởng đến tốc độ và hiệu suất của hệ thống. Sử dụng Stored Procedures có thể giảm thiểu số lần truyền dữ liệu giữa ứng dụng và cơ sở dữ liệu, giúp tăng hiệu suất và tối ưu hóa hệ thống.

Nhược điểm:

Tìm lỗi và gỡ lỗi (debug) khó khăn: Mặc dù bạn có thể gỡ lỗi bằng việc check log hoặc print message, nhưng về tổng thể thì việc gỡ lỗi trên stored procedures không thuận tiện.

Đòi hỏi kỹ năng SQL cao: Việc viết stored procedures yêu cầu có kiến thức chuyên môn về SQL. Điều này có thể khiến việc phát triển trở nên khó khăn hơn so với việc viết trực tiếp SQL trong tầng ứng dụng.

Quản lý mã không hiệu quả: Việc quản lý các mã, logic không hiệu quả. Việc tìm kiếm code trên database không tốt bằng trên ứng dụng.

Tốn nhiều tài nguyên: Các stored procedures làm cho máy chủ cơ sở dữ liệu tốn nhiều tài nguyên hơn, trong khi tài nguyên này nên được tập trung cho việc quản lý lưu trữ liệu.

– Khả năng xử lý logic, nghiệp vụ: Xử lý các thao tác, nghiệp vụ phức tạp trên SQL (ngôn ngữ truy vấn dữ liệu) sẽ không mạnh bằng trên các ngôn ngữ lập trình.

Viết SQL trong tầng ứng dụng

Ngược lại so với cách trên, các câu truy vấn SQL sẽ được viết trực tiếp trong tầng ứng dụng. Tầng ứng dụng sẽ gọi trực tiếp các truy vấn SQL.

Ưu điểm:

– Dễ triển khai các chức năng: Dễ dàng trong việc triển khai các chức năng có logic phức tạp hơn. Với từng ngôn ngữ sẽ có những thư viện và framework hỗ trợ xử lý logic nghiệp vụ tốt hơn khi so với viết SQL trong strored procedures.

Dễ tìm và gỡ lỗi: Khi xảy ra lỗi trong truy vấn SQL, việc sửa lỗi trực tiếp trong tầng ứng dụng thường dễ dàng hơn việc sửa trong một stored procedure. Quá trình tìm lỗi và gỡ lỗi được hỗ trợ đắc lực từ các trình gỡ lỗi.

Dễ học và dễ hiểu: Khi viết trực tiếp SQL trong tầng ứng dụng, lập trình viên có thể sử dụng những câu lệnh SQL quen thuộc và dễ hiểu. Việc này giúp cho các lập trình viên mới tham gia dự án có thể nhanh chóng học được cách tương tác với cơ sở dữ liệu.

– Hạn chế việc chuyển qua lại giữa code ứng dụng và code SQL. Lập trình viên có thể tập trung hoàn toàn vào việc xây dựng các chức năng ngay trên tầng ứng dụng.

Quản lý mã tốt hơn: Quản lý mã nguồn, logic trên tầng ứng dụng tốt hơn trên stored procedures.

Nhược điểm:

– Bảo mật kém: Khi viết SQL trong tầng ứng dụng, các biến truyền vào câu lệnh SQL có thể bị hacker lợi dụng. Bằng cách truyền vào các giá trị nguy hiểm, hệ thống của bạn có thể gánh chịu hậu quả nghiêm trọng (SQL Injection).

Tăng khả năng lặp lại code: Khi có nhiều chức năng cần sử dụng cùng một đoạn SQL, việc lặp lại code có thể dẫn đến khó khăn trong việc bảo trì và sửa chữa.

– Hiệu suất kém: Khi một câu lệnh SQL được gửi từ tầng ứng dụng xuống, máy chủ cơ sở dữ liệu sẽ phải biên dịch SQL. Sau đó thực thi SQL và trả về kết quả. Quá trình này có thể tốn nhiều chi phí hơn so với khi ta viết bằng stored procedures.

Nên viết SQL ở đâu?

Để trả lời cho câu hỏi “Nên viết SQL ở đâu? Về cơ bản, bạn cần cân nhắc các yêu tố như: Tính chất, quy mô, độ bảo mật,…

Áp dụng viết code trên tầng ứng dụng nếu:

  • Dự án cần phát triển nhanh.
  • Dự án quy mô nhỏ, có số lượng truy vấn ít và yêu cầu về hiệu suất không cao.
  • Dự án đặc thù không thể áp dụng viết SQL trong stored procedures. Ví dụ: ứng dụng đòi hỏi khả năng tương tác linh hoạt nhiều loại cơ sở dữ liệu.

Áp dụng viết SQL trong stored procedures nếu:

  • Dự án lớn, phức tạp, cấu trúc dữ liệu phức tạp và số lượng truy vấn lớn.
  • Dự án yêu cầu khắt khe về hiệu suất.
  • Dự án cần độ bảo mật cao.

Tất nhiên, đây chỉ là những quan điểm cá nhân của bản thân mình. Việc áp dụng như thế nào phụ thuộc vào sự quyết định của bạn.

Các bài viết liên quan

Bạn có thế đọc thêm các bài viết về chủ đề CNTT tại đây nhé: Công nghệ thông tin.

Lời kết

Như vậy, bài viết về vấn đề “Nên viết SQL ở đâu?” đã đến hồi kết. Mình mong rằng bài viết này có thể giúp bạn hiểu rõ hơn về 2 cách trên. Từ đó, bạn có thể lựa chọn cho phù hợp với đặc thù của từng dự án.

Cuối cùng, cảm ơn bạn đã đọc hết bài viết này, nếu bạn có vấn đề cần giải đáp, hãy liên hệ với mình nhé!


Bản quyền:

Hình ảnh đại diện của bài viết thuộc về Freepik.

Được phân loại:

Được gắn thẻ:

,