Một SQL tốt hơn chỉ với 11 dòng mã: Ngôn ngữ truy vấn Prela
Prela, một ngôn ngữ truy vấn mới đang được phát triển tại UCLA RePL, hứa hẹn thay thế SQL bằng cách tiếp cận đơn giản hơn dựa trên quan hệ nhị phân (binary relations). Bài viết hướng dẫn xây dựng một phiên bản đồ chơi của Prela bằng Python, giúp độc giả hiểu sâu các nguyên lý cốt lõi như phép hợp thành quan hệ, bộ lọc và toán tử nối. Với cú pháp ngắn gọn, Prela có thể rút ngắn các truy vấn phức tạp từ hơn 20 dòng SQL xuống còn khoảng 11 dòng, mở ra một hướng mới cho ngành quản trị cơ sở dữ liệu.
Một SQL tốt hơn chỉ với 11 dòng mã: Ngôn ngữ truy vấn Prela
Prela là một ngôn ngữ truy vấn mới đang được phát triển tại phòng thí nghiệm UCLA RePL, hứa hẹn thay đổi cách chúng ta tương tác với cơ sở dữ liệu. Khác biệt hoàn toàn với SQL, Prela tập trung vào các quan hệ nhị phân (binary relations) — tức bảng chỉ có hai cột — giúp đơn giản hóa tư duy truy vấn và rút ngắn đáng kể độ dài mã nguồn.
Bài hướng dẫn này sẽ dẫn dắt bạn xây dựng một phiên bản "đồ chơi" của Prela bằng Python, từ đó hiểu rõ các nguyên lý cốt lõi. Điểm ấn tượng nhất: một truy vấn phức tạp tìm phim do công ty Mỹ sản xuất và có tên nhân vật trong nhan đề, kèm theo bí danh diễn viên, chỉ cần khoảng 11 dòng code — trong khi truy vấn tương đương trong SQL vượt quá 20 dòng.
Từ bảng rộng đến quan hệ nhị phân
Ý tưởng đầu tiên của Prela là chỉ có các bảng hai cột (binary relations). Nghe có vẻ hạn chế, nhưng mọi bảng nhiều cột đều có thể "phân đôi" dễ dàng. Ví dụ, một bảng phim với các cột ID, title, year sẽ được tách thành ba quan hệ nhị phân: một quan hệ ánh xạ số hàng đến giá trị cột tương ứng.
movie = {1: ('Casablanca', 1942), 2: ('The Godfather', 1972)}
# Sau khi binarize:
# movie_id -> title, movie_id -> year
Điều thú vị là quan hệ nhị phân khái quát hóa khái niệm hàm số. Nếu hàm ánh xạ một đầu vào đến một đầu ra duy nhất, thì quan hệ có thể ánh xạ một đầu vào đến nhiều đầu ra — giống như một hàm không xác định (nondeterministic function). Chính điều này mang lại sức mạnh linh hoạt cho Prela.
Phép hợp thành quan hệ (Relation Composition)
Toán tử quan trọng nhất trong Prela là phép hợp thành. Giống như hợp thành hàm số trong toán học, phép hợp thành hai quan hệ r và s tạo ra một quan hệ mới: đầu tiên ánh xạ x qua r để có y, sau đó ánh xạ y qua s để có kết quả cuối cùng. Việc cài đặt trở nên cực kỳ đơn giản khi ta chuyển s thành dictionary và duyệt qua các cặp (x, y) trong r.
def select(r, d):
return {x: d[y] for x, y in r.items() if y in d}
Ví dụ, để tìm tên phim từ ID, bạn chỉ cần movie.select(title) — trông giống như đang gọi phương thức, đọc hiểu rất tự nhiên: "phim, chọn tên". Sức mạnh thực sự đến khi bạn nối chuỗi nhiều lần gọi .select để đi qua nhiều mối quan hệ, chẳng hạn tìm quốc gia của công ty sản xuất phim: movie.s(company).s(country).
Điều kỳ diệu ở đây là Prela tự động chèn bước "resolve" ID thành bản ghi, nên cú pháp đọc giống hệt câu mô tả: "phim → công ty của phim → quốc gia của công ty". Với SQL, bạn phải viết thủ công các JOIN lằng nhằng.
Chọn nhiều cột và lọc dữ liệu
Để chọn nhiều thuộc tính cùng lúc, Prela sử dụng toán tử &. Điểm đặc biệt: & nối hai quan hệ dựa trên cột đầu tiên của chúng và ghép cặp cột thứ hai thành một tuple. Kết quả vẫn là một quan hệ nhị phân, nên bạn có thể tiếp tục hợp thành vô hạn.
title & year # trả về {movie_id: (title, year)}
Bộ lọc được thực hiện qua hai toán tử: .eq(v) để thu hẹp quan hệ chỉ giữ các cặp có cột thứ hai bằng giá trị v cho trước, và .where(predicate) áp dụng bộ lọc vào một quan hệ khác. Đọc mã: "movies.where(movie.s(company).s(country).eq('us'))" — chính là "phim mà quốc gia của công ty là Mỹ". Quá rõ ràng so với WHERE phức tạp trong SQL.
Tái cấu trúc giống hằng đẳng thức trong Python
Một ưu điểm không ngờ: vì mọi truy vấn trong Prela đều là các toán tử kết hợp, bất kỳ biểu thức con nào cũng là một truy vấn hợp lệ. Điều đó nghĩa là bạn có thể gán truy vấn trung gian cho biến Python — giống hệt CTE (Common Table Expression) trong SQL nhưng không cần cú pháp WITH. Ví dụ:
american_movies = movies.where(movie.s(company).s(country).eq('us'))
Kết hợp nhiều điều kiện và tổng kết
Một phát hiện thú vị: toán tử & vốn dùng để nối quan hệ, nhưng khi nằm trong .where, nó lại hoạt động như phép toán logic AND. Ví dụ, muốn tìm phim Mỹ sản xuất năm 1942, bạn viết .where((..).eq('us') & (..).eq(1942)). Điều này tự nhiên đến mức không cần keyword riêng.
Cuối cùng, bạn có thể gộp cả bộ lọc vào ngay mệnh đề .select để có truy vấn gọn nhất. Và đó gần như là toàn bộ ngôn ngữ: Prela cũng hỗ trợ group, aggregate và các toán tử phổ biến khác. Hiện nhóm phát triển đang hoàn thiện tài liệu đầy đủ, và bạn có thể tham khảo bài báo khoa học của họ để tìm hiểu sâu hơn.
Ý nghĩa đối với cộng đồng lập trình Việt Nam
Với xu hướng dữ liệu ngày càng lớn và phức tạp, một ngôn ngữ truy vấn trực quan, dễ học như Prela đáng để các lập trình viên Việt Nam theo dõi. Việc rút ngắn độ dài mã không chỉ tiết kiệm thời gian gõ mà còn giảm thiểu sai sót logic. Hơn nữa, kiến trúc dựa trên quan hệ nhị phân cũng hứa hẹn hiệu suất tốt hơn trong các hệ thống phân tán, khi việc nén dữ liệu và tối ưu hóa truy vấn được tự động hóa.
Tuy Prela mới ở giai đoạn nghiên cứu, nhưng cách tiếp cận "mọi thứ là quan hệ" mang lại một luồng gió mới. Nếu bạn muốn thử ngay, mã nguồn Python tự chứa cho phiên bản đồ chơi của Prela đã được công bố — một bài tập tuyệt vời cho những ai yêu thích cơ sở dữ liệu và thiết kế ngôn ngữ.