Làm chủ Prisma và các mối quan hệ SQL
Prisma giúp việc làm việc với cơ sở dữ liệu trở nên đơn giản nếu bạn hiểu cách nó xử lý các kết nối. Dưới đây là hướng dẫn về schema, quan hệ và truy vấn.
Schema và các mối quan hệ
Các mối quan hệ xác định cách dữ liệu của bạn kết nối với nhau.
- One-to-Many: Một người dùng có nhiều bài viết. Model Post giữ khóa ngoại (authorId). Model User chỉ giữ một tham chiếu.
- Many-to-Many: Một người dùng thuộc về nhiều dự án, và một dự án có nhiều người dùng. Bạn cần một bảng trung gian (ProjectMember) nằm ở giữa. Bảng này giữ các khóa ngoại cho cả hai phía.
- Self-Relations: Một người dùng theo dõi một người dùng khác. Bạn sử dụng các quan hệ được đặt tên như "Follower" và "Following" để Prisma biết bên nào là bên nào.
Các phương thức truy vấn chính
- findUnique: Sử dụng phương thức này cho các bản ghi có trường @id hoặc @unique. Nó sẽ trả về null nếu không tìm thấy gì.
- findMany: Sử dụng để lấy một danh sách. Bạn có thể lọc, sắp xếp và phân trang.
- findFirst: Sử dụng khi bạn cần một bản ghi nhưng bộ lọc không phải là một trường duy nhất.
Lọc với Where
Mệnh đề "where" ánh xạ trực tiếp tới SQL.
- So sánh: Sử dụng gt (lớn hơn), lt (nhỏ hơn), hoặc gte (lớn hơn hoặc bằng).
- Tìm kiếm văn bản: Sử dụng "contains" với "mode: insensitive" để tìm kiếm không phân biệt chữ hoa chữ thường.
- Toán tử logic: Sử dụng OR, AND, hoặc NOT để kết hợp các điều kiện.
- Bộ lọc quan hệ: Sử dụng "some", "every", hoặc "none" để lọc dựa trên dữ liệu được kết nối. "some" tìm các bản ghi mà có ít nhất một quan hệ khớp.
Kiểm soát dữ liệu: Select so với Include
- select: Chọn chính xác những trường nào cần trả về. Điều này giúp dữ liệu của bạn nhẹ và bảo mật hơn.
- include: Kết hợp dữ liệu liên quan vào kết quả của bạn. Điều này giúp đưa vào các đối tượng lồng nhau.
- Lưu ý: Bạn không thể sử dụng select và include ở cùng một cấp độ. Bạn phải chọn một trong hai. Tuy nhiên, bạn có thể sử dụng select bên trong một include để chọn các trường cụ thể từ một quan hệ được kết hợp.
Các thao tác và tính an toàn
- createMany: Tạo nhiều hàng cùng một lúc. Nó nhanh nhưng không hỗ trợ ghi lồng nhau (nested writes).
- upsert: Cập nhật một bản ghi nếu nó tồn tại hoặc tạo mới nếu nó chưa tồn tại. Điều này rất tuyệt vời cho giỏ hàng.
- update: Sử dụng các thao tác nguyên tử (atomic operations) như increment hoặc decrement để thay đổi các con số mà không gây lỗi.
- $transaction: Nhóm nhiều thao tác ghi lại với nhau. Nếu một phần thất bại, toàn bộ nhóm sẽ được hoàn tác (rollback). Điều này giúp ngăn chặn các lỗi dữ liệu không hoàn chỉnh.
Phân trang
Kết hợp "take" và "skip" để xây dựng các trang.
- take: Số lượng bản ghi cần hiển thị.
- skip: Số lượng bản ghi cần bỏ qua.
Nguồn: https://dev.to/chinwuba_jeffrey/understanding-prisma-and-sql-relationships-schema-and-querying-l7k