Google Cloud Datastoreで初めるNoSQL

データベース

システムで取り扱うデータベースは大きく分けて、リレーショナルデータベース (以下RDBMS) とNoSQLの2つあります。多くのシステムで無くてはならない存在であるRDBMSですが、スケールアウトし難いという問題があります。リードレプリカを作成するなど工夫はできますが、データの書き込み・書き換えが頻繁に発生するとなるとデータベースを分けるなど、そのシステムの成長とともに工夫が必要になります。それを解決できる可能性を秘めたデータベースがNoSQLになります。

NoSQL

一言でNoSQLといっても、NoSQLにはいろいろなタイプのデータベースがあります。なぜなら、NoSQLに明確な定義が存在しないからです。しかし多くのエンジニアが期待するのは、RDBMSの大きな欠点であるスケールアウトの点かと思います。近年の有名なNoSQLと言えば、Google BigTable, Amazon DynamoDB, MongoDB, Apache Cassandraなどありますが、私はGoogle Cloud Datastore (以下GCD) をオススメしたいと思います。

Google Cloud Datastore

なぜGCDなのかと言えば、Google App Engine (以下GAE) やGoogle Cloud Functionとの相性がよく、ローカル上にも簡単に開発環境も整えることができます。またRDBMSに慣れ親しんだエンジニアがNoSQLの勉強をする際、最も気になるのがクエリ文の書き方ですが、GCDにはGQLと呼ばれるSQLに似たクエリ文が存在します。これまで使っていたSELECT文と同じ文法を利用できることは、NoSQL導入への敷居が下がります。 Google Cloud Datastore GCDは、Google Cloud Platform (以下GCP) のコンソール画面からも利用することができるので、今回はその利用方法を紹介したいと思います。

Google Cloud Datastoreの利用

GCPのコンソール画面よりプロジェクトを選択します。次にナビゲーションメニューより「データストア」を選択します。すると下の「データストア」画面が表示されるでしょう。画面上に「エンティティ」と表示されていますが、MySQL (RDBMS) でいうところのテーブルに相当します。画面上部にある「エンティティを作成」を押下しましょう。 データストア MySQLであれば、まずデータを投入するためのテーブルを作成しますが、GCDで最初のデータを投入するときにテーブルのカラムも作成します。それぞれ名称が異なりますので、一旦整理しましょう。
GCD MySQL
エンティティ テーブル
プロパティ カラム
ではデータを登録しましょう。下の図は、Nameプロパティを用意しているところです。このNameプロパティの値を検索するのであれば、インデックスを登録しておいたほうが検索が早くなります。
  • 種類(テーブル名) … Enployee
  • 新しいプロパティ
    • 名前 … Name
    • タイプ … 文字列
    • 値 … Shimizu
    • このプロパティをインデックス登録する … チェックを入れる
エンティティ登録 入力が終わったら「+プロパティを追加」を押下して下さい。次はAgeプロパティを追懐します。
  • 名前 … Age
  • タイプ … 整数
  • 値 … 41
  • このプロパティをインデックス登録する … チェックを外す
エンティティ登録 最初のデータの入力は以上です。最後に「作成」ボタンを押下して登録します。新しくエンティティが作成され、同時にデータが追加されたことがわかります。また同様なデータを4件追加し、計5件としました。 エンティティ登録

GQL

先述したとおり、GQLとはRDBMSのSQLに似たクエリ文を書くことができます。大きく異なる点は、GQLではJOINなどによるテーブル結合ができません。では試しにGQLを書いてみましょう。「GQLによるクエリ」タブを押下し、クエリ項目に次のクエリ文を入力して下さい。
SELECT * FROM Employee
「クエリを実行」ボタンを押下すると画面下部に結果が表示されます。「ID」はGCDにより自動的に割り振られた値となります。もちろんWHERE句の利用できます。 クエリ文実行
SELECT * FROM Employee WHERE Name = 'Kimura'
とし検索すると Kimura だけが抽出されることがわかります。 クエリ文実行
SELECT * FROM Employee WHERE Country = 'Japan'
とし検索してみて下さい。Countryというプロパティは作成していませんが、エラーとならず「このクエリに一致するエンティティがありません。」との結果が返りました。 クエリ文実行 RDBMSであればクエリ文のエラーになりますが、GCDではデータ毎に自由にプロパティをセットすることができます。そのため、存在しないプロパティであってもエラーにはなりません。これはGCDの良い点でもあり、注意すべき点でもあります。注意しながら利用して下さい。

まとめ

上記の通り、GCDはこれまで慣れ親しんだRDBMSと同じような感覚でデータ抽出できることが解って頂けたかと思います。このGQLがあれば、RDBMSからの移行もスムーズになるかと思います。ただし、そもそもの仕組みが異なるため、プロジェクトに適しているのか、NoSQLに適したシステムに変更することは可能かなど検討を慎重に進めてから採用を決めて下さい。
» エンジニア登録はこちら