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:

Bảng post với 1000 bản ghi

 

Bảng author gồm 5 bản ghi. Toàn những cái tên khét tiếng !!!

 

 

Bảng category gồm 5 bản ghi

 

 

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ề:

Đầy đủ thông tin về một bài viết. Cool !!!

 

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ầntá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

Tạo View full_post thành cô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

Kết quả y hệt chỉ với 2 dòng code. Cool !!!

 

Một lưu ý nho nhỏ: View chỉ lưu trữ câu lệnh SQL 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