【サンプルクエリあり】QLDB を試してみた

記事タイトルとURLをコピーする

はじめに

Database Speciality を受ける関係で、Amazon QLDB を触ったので備忘録がてら残しておきます。

Amazon QLDB とは

AWS が提供する台帳型 DB です。

台帳とは、経済活動や財務活動の履歴を記録するあれです。

参考:

Amazon | コクヨ 社内用紙 賃金台帳 B4 4穴 20組 シン-122 | 帳簿 | 文房具・オフィス用品

台帳では、全ての履歴を改ざんされないよう厳格に管理する必要があるのですが、QLDB を使えばそれを簡単に行えるということですね。

ドキュメントにもそのように書かれていました。

台帳は、通常、企業の経済活動や財務活動の履歴を記録するために使用されます。
(省略)
Amazon QLDB は、台帳のようなアプリケーションを自分で構築するという複雑な開発作業を行う必要がありません。 https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/what-is.html

QLDB の インフラコンポーネント

QLDB は、サーバーレースアーキテクチャです。
ユーザは、事前にインフラリソースをプロビジョニングする必要がなく、利用した分だけインフラリソースを利用することができます。

QLDB はストレージ構造が特殊です。
具体的には、①ジャーナルストレージ②インデックス付きストレージの2種類が存在します。

①ジャーナルストレージ

  • 変更履歴であるジャーナルが保存されるストレージ領域です。

②インデックス付きストレージ

  • 台帳のテーブルやインデックス、インデックス履歴が格納されるストレージ領域です。
    • インデックス履歴というのは、ジャーナルをテーブル化したものです。テーブル化することで簡単にクエリ処理が可能です。

参考: https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/ledger-structure.html#ledger-structure.storage

ちなみに更新時は、 以下の順序で更新が行われます。

①ジャーナルストレージにジャーナルがコミット
②①のジャーナルをもとに、テーブルを更新

QLDB の DB コンポーネント

QLDB の DB コンポーネントは、RDB と名称が異なるものがちらほらあります。

この辺は、AWS ドキュメントに分かりやすい比較表がありましたので載せておきます。

f:id:swx-sugaya:20210928181627p:plain

引用元: https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/what-is.relational-ledger.html

実際にクエリを投げてみる

実際に QLDB を構築してクエリを投げてみました。

賃金台帳ってきっとこんな感じだろうなという想像のもと、賃金台帳を作成してみます。

①台帳の作成

まずは、台帳データベースを作成してください。

サーバレースアーキテクチャのため、パラメータも迷うことなく、サクサクいけましたが、一応以下に僕が作ったときのパラメータを追記しておきます。

Key Value
台帳名 chingin
台帳アクセス許可モード 標準
保管時のデータを暗号化 AWS 所有キー
タグ なし

クエリを投げる。

「①台帳の作成」で作成した台帳にクエリを投げます。

AWS ではマネコンから PartiQL を投げられる "クエリエディタ" と呼ばれるハイパー便利機能があるのでこちらを利用していきます。

台帳DBにアクセス権限がある IAM を使用して、順番に実行してみてください。

※ 手入力する際、シングルクォーテーションとダブルクォーテーションの違いでエラーになることが多いので気を付けて入力して下さい。

①年度別の賃金情報を格納する台帳テーブルを作成します。

create table "2021"

② インデックスを貼ります。

create index on "2021" (paymentId)
create index on "2021" (peopleId)

③賃金データを書き込みます。今回は2か月分の給与書き込んでる想定です。

insert into "2021" <<{ 'paymentId':'000001', 'peopleId':'0001', 'people':'Bob', 'wage':'200000', 'due':'8/25' }>>
insert into "2021" <<{ 'paymentId':'000002', 'peopleId':'0002', 'people':'Olivia', 'wage':'300000', 'due':'8/25' }>>
insert into "2021" <<{ 'paymentId':'000003', 'peopleId':'0001', 'people':'Bob', 'wage':'200000', 'due':'9/25' }>>
insert into "2021" <<{ 'paymentId':'000004', 'peopleId':'0002', 'people':'Olivia', 'wage':'300000', 'due':'9/25' }>>

③書き込んだ情報を見てみます

select * from "2021"

## Bob の賃金情報を見る
select * from "2021" where peopleId='0001'

④Bob の賃金情報を書き換えます。昇給を反映していなかったみたいなイメージの変更です、わら

update "2021" as t set t.wage = '310000' where t.paymentId='000004'

## 確認
select * from "2021" where paymentId='000004'

⑤テーブルの更新履歴を確認するために、履歴テーブルに対してクエリを投げます。
ここまでうまくできていると、②~④の履歴が見えるはずです。

select * from history( "2021" ) as h

おわりに

実際にクエリを投げることで QLDB の理解が進んだのではないでしょうか?

不要になった台帳DB は、必ず消してくださいね! こちらはデフォルトで削除保護が有効になっているので、外してから消してください。

以上ご覧いただきありがとうございました。

菅谷 歩 (記事一覧)