PostgreSQL 18 giới thiệu virtual generated columns, một tính năng tính toán giá trị theo yêu cầu mà không cần lưu trữ chúng trên đĩa. Mặc dù khả năng này đã tạo ra sự phấn khích khi hoàn thiện bộ tính năng của PostgreSQL để cạnh tranh với các đối thủ như MySQL, nó cũng đã khơi dậy những cuộc thảo luận có ý nghĩa trong cộng đồng nhà phát triển về vị trí logic cơ sở dữ liệu nên được đặt ở đâu và những hạn chế nào vẫn còn tồn tại.
Cộng đồng đặt câu hỏi về các giải pháp thay thế hiện có
Một số nhà phát triển đang đặt câu hỏi liệu virtual generated columns có mang lại lợi thế đáng kể so với các tính năng PostgreSQL hiện có hay không. Cơ sở dữ liệu này từ lâu đã hỗ trợ các cột ảo dựa trên hàm thông qua syntactic sugar, nơi các nhà phát triển có thể tạo các hàm nhận kiểu record của bảng làm đầu vào và trả về các giá trị được tính toán. Tuy nhiên, cách tiếp cận này yêu cầu các client phải biết về những hàm này và không bao gồm các giá trị được tính toán trong các thao tác tiêu chuẩn như truy vấn SELECT *
. Các virtual generated columns mới tích hợp liền mạch hơn vào schema của bảng, làm cho chúng hiển thị với tất cả các tương tác cơ sở dữ liệu mà không yêu cầu kiến thức đặc biệt từ các nhà phát triển ứng dụng.
So sánh Virtual Generated Columns và Stored Generated Columns
Tính năng | Virtual Generated Columns | Stored Generated Columns |
---|---|---|
Lưu trữ | Không cần lưu trữ trên đĩa | Được lưu trữ vĩnh viễn trên đĩa |
Hiệu suất | Được tính toán mỗi khi truy vấn | Đọc nhanh, ghi chậm hơn |
Đánh chỉ mục | Không được hỗ trợ | Có thể được đánh chỉ mục như các cột thông thường |
Thay đổi Schema | Thêm vào ngay lập tức | Có thể yêu cầu viết lại bảng |
Trường hợp sử dụng tốt nhất | Biểu thức nhẹ, tính năng thử nghiệm | Tính toán phức tạp, dữ liệu được truy vấn thường xuyên |
Các hạn chế làm nổi bật những khả năng còn thiếu của PostgreSQL
Việc giới thiệu virtual generated columns đã thu hút sự chú ý đến một số hạn chế đáng kể trong kiến trúc hiện tại của PostgreSQL. Generated columns chỉ có thể tham chiếu dữ liệu trong hàng hiện tại, ngăn cản các phép tính phức tạp hơn có thể liên quan đến các hàng hoặc bảng khác. Hạn chế này đã làm tái sinh các yêu cầu về automatic incremental view maintenance, một tính năng cho phép cơ sở dữ liệu duy trì hiệu quả các kết quả tính toán trên nhiều bảng.
Stored generated columns sẽ hữu ích hơn nhiều nếu chúng có thể tham chiếu các hàng và bảng khác, chúng bị giới hạn chỉ trong hàng hiện tại.
Hạn chế này có nghĩa là trong khi virtual generated columns hoạt động tốt cho các phép biến đổi đơn giản như chuyển đổi chữ hoa chữ thường hoặc trích xuất trường JSON, chúng không thể xử lý logic nghiệp vụ phức tạp hơn yêu cầu tính toán cross-row hoặc cross-table.
Hạn chế của Generated Column
- Chỉ có thể tham chiếu đến các cột trong hàng hiện tại
- Không thể tham chiếu đến các bảng hoặc hàng khác
- Không thể sử dụng subquery hoặc các hàm tổng hợp
- Giới hạn ở các biểu thức xác định
- Cân nhắc về bảo mật với các hàm tùy chỉnh và kiểu dữ liệu do người dùng định nghĩa
Vị trí đặt logic ứng dụng vẫn gây tranh cãi
Tính năng này đã làm bùng phát lại cuộc tranh luận kinh điển về nơi logic tính toán nên được đặt trong các ứng dụng hiện đại. Một số nhà phát triển cho rằng các thao tác đơn giản như thao tác chuỗi nên được giữ lại trong mã ứng dụng thay vì được đẩy xuống lớp cơ sở dữ liệu. Họ xem virtual generated columns như một sự phức tạp không cần thiết cho các thao tác dễ dàng thực hiện trong hầu hết các ngôn ngữ lập trình. Những người khác phản bác rằng việc tập trung logic này trong cơ sở dữ liệu đảm bảo tính nhất quán trên tất cả các ứng dụng và giảm khả năng có sự khác biệt trong triển khai giữa các client khác nhau truy cập cùng một dữ liệu.
Sự đánh đổi về hiệu suất định hình các mẫu sử dụng
Virtual generated columns đưa ra một sự đánh đổi hiệu suất rõ ràng so với các đối tác stored của chúng. Trong khi stored generated columns thêm overhead trong các thao tác ghi nhưng cho phép đọc nhanh với hỗ trợ indexing, virtual columns giữ cho việc ghi nhẹ nhàng với chi phí tính toán giá trị trong mỗi truy vấn. Điều này làm cho virtual columns đặc biệt hấp dẫn cho các tính năng thử nghiệm hoặc các trường được tính toán ít được truy cập, nơi overhead lưu trữ của các giá trị materialized sẽ là lãng phí.
Khả năng sửa đổi schema tức thì của virtual columns cũng giải quyết một mối quan tâm thực tế cho các cơ sở dữ liệu production. Việc thêm virtual columns không yêu cầu table rewrites hoặc các thao tác backfilling, làm cho chúng an toàn hơn để thử nghiệm các tính năng mới mà không có nguy cơ khóa cơ sở dữ liệu hoặc kéo dài cửa sổ bảo trì.
Virtual generated columns đại diện cho sự tiến hóa liên tục của PostgreSQL hướng tới sự hoàn thiện tính năng với các hệ thống cơ sở dữ liệu lớn khác. Mặc dù chúng có thể không cách mạng hóa thiết kế cơ sở dữ liệu, chúng cung cấp cho các nhà phát triển nhiều tính linh hoạt hơn trong việc tổ chức logic dữ liệu của họ và giảm overhead lưu trữ liên quan đến các giá trị được tính toán không yêu cầu indexing hoặc truy cập thường xuyên.
Tham khảo: My favorite PostgreSQL 18 Feature: Virtual Generated Columns