TopDev

Những việc cần chú ý mà Lập Trình Viên cần phải biết khi làm việc với Database

topdev 📖 4 phút đọc

Làm việc với database (SQL hoặc NoSQL) đòi hỏi không chỉ nắm cú pháp mà còn hiểu về hiệu năng, bảo mật và cách tổ chức dữ liệu. Dưới đây là tổng hợp những điểm cần lưu ýcác lỗi thường gặp khi làm việc với database — được chia thành các nhóm dễ nhớ 👇



🧱 1. Thiết kế cơ sở dữ liệu (Database Design)#

🔍 Lưu ý#

  • Chuẩn hóa (Normalization): Giảm trùng lặp dữ liệu, tách bảng hợp lý (1NF → 3NF).

  • Đặt tên rõ ràng: Tên bảng, cột phải có nghĩa, tránh viết tắt khó hiểu.

  • Khóa chính (Primary Key): Mỗi bảng phải có khóa chính duy nhất.

  • Khóa ngoại (Foreign Key): Dùng FK để đảm bảo quan hệ và toàn vẹn dữ liệu.

  • Chỉ mục (Index): Tạo index cho cột thường dùng trong WHERE, JOIN, ORDER BY — nhưng đừng lạm dụng.

  • Loại dữ liệu (Data Type): Chọn đúng kiểu dữ liệu (vd: INT thay vì VARCHAR cho ID).

⚠️ Lỗi thường gặp#

  • Dữ liệu trùng lặp do thiếu ràng buộc duy nhất (UNIQUE constraint).

  • Dùng VARCHAR cho mọi thứ → tốn bộ nhớ, giảm tốc độ.

  • Không có khóa chính → dữ liệu khó truy xuất và đồng bộ.

  • Không đặt DEFAULT hoặc NOT NULL hợp lý → sinh ra giá trị rỗng bất thường.



⚙️ 2. Viết truy vấn (SQL Query)#

🔍 Lưu ý#

  • Dùng Prepared Statement để tránh SQL Injection.

  • Tối ưu câu lệnh JOIN, chỉ lấy cột cần thiết (SELECT specific_columns).

  • Dùng LIMIT, OFFSET khi phân trang.

  • Viết comment cho query phức tạp.

  • Dùng EXPLAIN PLAN để phân tích hiệu năng câu lệnh truy vấn.

⚠️ Lỗi thường gặp#

  • Dùng SELECT * → gây tốn băng thông và giảm hiệu năng.

  • Không dùng WHERE hoặc điều kiện sai → xoá nhầm hoặc cập nhật nhầm dữ liệu.

  • JOIN sai điều kiện → nhân bản dữ liệu (duplicate rows).

  • Không commit/rollback đúng cách trong transaction → mất dữ liệu.



💾 3. Quản lý giao dịch (Transaction Handling)#

🔍 Lưu ý#

  • Hiểu rõ các mức Isolation Level (READ COMMITTED, SERIALIZABLE, …).

  • Sử dụng transaction khi thực hiện nhiều thao tác liên quan (Insert/Update/Delete).

  • Luôn commit hoặc rollback để tránh khóa bảng.

⚠️ Lỗi thường gặp#

  • Quên đóng transaction → gây deadlock hoặc connection leak.

  • Gộp quá nhiều logic trong một transaction → gây nghẽn database.

  • Không xử lý ngoại lệ → rollback không được thực hiện.



🧠 4. Quản lý kết nối (Connection Management)#

🔍 Lưu ý#

  • Dùng Connection Pool (vd: HikariCP, C3P0, DBCP).

  • Đóng connection, statement, resultset trong finally hoặc dùng try-with-resources.

  • Kiểm soát timeoutpool size hợp lý.

⚠️ Lỗi thường gặp#

  • Không đóng connection → rò rỉ tài nguyên (connection leak).

  • Mở kết nối mỗi lần truy vấn → giảm hiệu năng.

  • Pool quá nhỏ hoặc quá lớn → gây nghẽn hoặc chiếm tài nguyên hệ thống.



🔐 5. Bảo mật dữ liệu (Security)#

🔍 Lưu ý#

  • Không bao giờ nối chuỗi trực tiếp để tạo câu SQL (SQL Injection).

  • Mã hóa dữ liệu nhạy cảm (vd: mật khẩu, số thẻ).

  • Phân quyền người dùng trong database (chỉ cấp quyền cần thiết).

  • Ghi log truy cập database.

⚠️ Lỗi thường gặp#

  • Dùng tài khoản root/admin cho ứng dụng.

  • Lưu mật khẩu ở dạng plaintext.

  • Không lọc dữ liệu đầu vào người dùng.



🚀 6. Tối ưu hiệu năng (Performance)#

🔍 Lưu ý#

  • Tạo index hợp lý cho các cột tìm kiếm.

  • Tránh N+1 query problem (đặc biệt trong ORM như Hibernate).

  • Dùng caching (Redis, Memcached) cho dữ liệu đọc nhiều.

  • Xem lại query chậm (slow query log).

⚠️ Lỗi thường gặp#

  • Index sai cột hoặc quá nhiều index.

  • Truy vấn lặp trong vòng lặp.

  • Không giới hạn dữ liệu trả về.



🧩 7. ORM (JPA, Hibernate, MyBatis, v.v.)#

🔍 Lưu ý#

  • Hiểu rõ cách ORM ánh xạ bảng → object.

  • Dùng fetch = LAZY để tránh load toàn bộ dữ liệu.

  • Dùng batch insert/update cho dữ liệu lớn.

⚠️ Lỗi thường gặp#

  • LazyInitializationException do session đóng trước khi load dữ liệu.

  • Quên @Transactional → dữ liệu không commit.

  • equals()hashCode() sai trong entity → lỗi trong cache hoặc list.



📋 8. Sao lưu & khôi phục (Backup & Restore)#

🔍 Lưu ý#

  • Đặt lịch backup định kỳ (hằng ngày/tuần).

  • Kiểm tra file backup có thể khôi phục được.

  • Dùng công cụ versioning cho schema (Liquibase, Flyway).

⚠️ Lỗi thường gặp#

  • Backup lỗi nhưng không kiểm tra → mất dữ liệu thật.

  • Không có kế hoạch khôi phục.

  • Không đồng bộ schema giữa các môi trường (dev/test/prod).

Bài liên quan trong #Database

✓ Đã sao chép link