BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Google Logicaは、SQLクエリをより再利用でき、読みやすくすることを目指す

Google Logicaは、SQLクエリをより再利用でき、読みやすくすることを目指す

原文(投稿日:2021/04/24)へのリンク

Logicaは、データベースクエリのためのDatalogのような宣言型ロジックプログラミング言語である。複雑なクエリを構築してSQLにコンパイルするための再利用可能な抽象化の生成をサポートしている。そのため、Google独自のBigQueryに加えて、幅広いアプリケーションに適している。

SQLクエリを記述することは、GoogleのエンジニアとLogicaの作成者であるKonstantin Tretyakov氏とEvgeny Skvortsov氏の説明によると、悪夢になる可能性がある。

広く採用されているにもかかわらず、SQLは完璧ではありません。英単語の長いチェーン(70年代の昔ながらのCOBOLの精神を維持するために大文字で表記されることが多い)からステートメントを作成することは、非常に冗長になる可能性があります。数百行にまたがる単一のクエリは日常的に発生します。

この状況は、ビューと関数の非常に基本的な概念に加えて、SQLに組み込まれた高度な抽象化メカニズムの欠如の直接的な結果である。特に、Tretyakov氏とSkvortsov氏によると、SQLはパッケージを定義またはインポートする機能を提供していない。

Logicaは、論理プログラミングの原則を使ってSQLを作成する代替手段を提供しようとするものである。特に、命題論理を追加の構造で拡張する。たとえば、集約により、その名前が示すように、SQL GROUP BYステートメントで行うのと同様に、複数のクエリの結果を集約することができる。

Logicaの基本的な概念は、SQL関係を置き換える論理述語の概念である。実際に、Logica述語は、リレーションの行が満たさなければならない論理条件を記述する。述語として、構造、変数、否定、論理積(結合)、論理和(和集合)、および前述のように集約を使用できる。最も重要なことは、Logica述語は関数を使用できることである。この関数で追加のクエリ機能が必要となるわけではなく、構文がよりクリーンになり、述語の構成が簡素化される。

Googleが提供するLogicaは、BigQueryデータベースと適切に統合されている。Logica構文の短い例を次に示す。この例は、BigQueryを使用して人気のある赤ちゃんの名前を選択する方法を示している。

# Connecting predicate to a table.
BabyNames(..r) :- `bigquery-public-data.usa_names.usa_1910_current`(..r);

# Extracting an arbitrary sample from the table.
@Limit(BabyNamesSample, 11);
BabyNamesSample(..r) :- BabyNames(..r);  

NameCountByYear(name: , year:) += number :-
  BabyNames(name:, year:, number:);

# Finding most popular name for each year.
@OrderBy(TopNameByYear, "year");
TopNameByYear(year) ArgMax= name -> NameCountByYear(name:, year:);

Logicaの構文は、Datalog、つまりPrologによって強く知らされている。そのため、かなり難解に見える。ただし、Tretyakov氏とSkvortsov氏によると、読みにくい複雑なSQLクエリを使用し、より管理しやすい方法で表現したい場合には、適した選択となり得る。ただし、SQLには、テーブルへの列の追加、新しいテーブルの作成など、新しいデータプロパティを作成するためのデータ操作機能も含まれているため、SQLは単なるクエリ定義言語ではないことに注意してください。

前述のように、現在LogicaはBigQuery SQLに変換できる。一方で、PostgreSQLとSQLiteのサポートはロードマップ上にあり、すでに実験的に利用可能である。

この記事に星をつける

おすすめ度
スタイル

BT