Series này gồm 2 bài trình bày về View và Materialized View
Trong bài đầu tiên này, xin phép trình bày về View trước.
Trước tiên xin bắt đầu với một database model đơn giản với 3 bảng: post, category và author
Như các bạn thấy, quan hệ giữa 2 bảng post-category và post-author đều là quan hệ 1:nhiều
Sau khi đã có database model, ta tiến hành insert dữ liệu bằng cách sử dụng Mockaroo.
Để cho đơn giản, trong bảng post, author_id và category_id sẽ chỉ giới hạn trong 5 giá trị: 1,2,3,4,5, tương ứng với 5 bản ghi trong bảng author và category
Sau khi insert dữ liệu mẫu, các bảng post, author và category của tôi sẽ có dạng như sau:
OK, các bảng đã được setup xong !!! Bây giờ, tôi muốn lấy đầy đủ thông tin của 1 bài viết, bao gồm:
- Tiêu đề và nội dung bài viết
- Tên đầy đủ và email của tác giả
- Tiêu đề và mô tả của category mà bài viết thuộc về
Để đáp ứng yêu cầu trên, câu lệnh SQL của chúng ta sẽ là như này:
SELECT post.title, post.content, author.first_name || ‘ ‘ || author.last_name AS author_name,
author.email AS author_email, category.title AS category_title, category.description AS category_description
FROM post, category, author
WHERE post.author_id = author.id
AND post.category_id = category.id
và đây là kết quả trả về:
Hmmm, thế bây giờ cứ khi nào tôi cần lấy đầy đủ thông tin về một bài viết, tôi sẽ lại phải tìm và copy&paste đoạn code dài ngoằng kia vào à ? Liệu có cách nào nhanh hơn không ? Liệu tôi có thể "đóng gói" đoạn SQL kia vào trong một "object" kiểu như một function để đến khi nào cần tôi chỉ cần "gọi" phát là xong ?
Well, Postgresql View chính xác là những gì bạn cần !
Với View, bạn có thể viết một lần và tái sử dụng một đoạn code SQL
Hãy "đóng gói" đoạn SQL dài ngoẵng bên trên vào trong 1 View với câu lệnh sau:
CREATE VIEW full_post AS
SELECT post.title, post.content, author.first_name || ‘ ‘ || author.last_name AS author_name,
author.email AS author_email, category.title AS category_title, category.description AS category_description
FROM post, category, author
WHERE post.author_id = author.id
AND post.category_id = category.id
Cú pháp rất đơn giản:
- CREATE VIEW full_post: Tạo một View với tên là full_post
- Theo sau là từ khóa AS
- Sau từ khóa AS là đoạn code SQL mà ta muốn tái sử dụng
Với view full_post vừa tạo, ta có thể tái sử dụng đoạn SQL phức tạp ở trên với 1 câu lệnh đơn giản:
SELECT *
FROM full_post
Một lưu ý nho nhỏ: View chỉ lưu trữ câu lệnh SQL và không lưu trữ kết quả của câu lệnh. Do đó, cùng một View, mỗi lần sử dụng có thể cho ra kết quả khác nhau vì dữ liệu ở các bảng được query đã thay đổi
Nếu như bạn vừa muốn lưu trữ câu lệnh SQL, vừa muốn lưu trữ kết quả cuả câu lệnh, xin hãy đón đọc phần 2 của series bài viết, trình bày về Postgres Materialized View
Bình luận