HackoladeでDBをモデリングしてみる（Firestoreを例に）

最近、半ば趣味でFirestoreを触っているのですが、ずっと疑問に思っていたのが、NoSQLのモデリングを支援してくれるようなツールって全然見かけないなぁという点。RDBであればいろいろ出ていますよね。

パッと検索すると、見つかるのはこのあたり？

* [NoSQL Workbench](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.html) : Amazon DynamoDBのモデリングができる

そんな中で、目に留まったのが、Hackoladeというソフトウェア。

![Hackolade公式サイトトップページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/7a7f3398-31d9-e195-7536-b3040ef9d241.png)

様々なNoSQLなデータベースのモデリングができる感じでしょうか？
調べてみても日本語の情報は皆無。
単純に知名度が低いのか、怪しいソフトウェアなのか、モデリングツールを使うという慣習が無いのか・・・？

とりあえず、ほんの少し触ってみました。

# ソフトウェア概要

## 対応DB

[公式サイト](https://hackolade.com/nosqldb.html)で紹介されている、対応データベース・検索エンジン・言語は以下のとおり。

![対応DB一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/dec77940-c129-dc87-dba3-9ff65e43a425.png)

* [Apache Avro Schema](https://avro.apache.org/)
* [Apache Cassandra](http://cassandra.apache.org/)
* [Apache HBase](https://hbase.apache.org/)
* [Apache Hive](https://hive.apache.org/)
* [Apache Parquet Schema](https://parquet.apache.org/)
* [AWS DynamoDB](https://aws.amazon.com/jp/dynamodb/)
* [AWS Glue Data Catalog](https://aws.amazon.com/jp/glue/)
* [Azure Cosmos DB](https://azure.microsoft.com/ja-jp/try/cosmosdb/)
* [Couchbase](https://www.couchbase.com/)
* [DataStax](https://www.datastax.com/)
* [Elasticsearch](https://www.elastic.co/jp/)
* [Google RealTime Firebase](https://firebase.google.com/docs/database?hl=ja)
* [Google Cloud Firestore](https://cloud.google.com/firestore?hl=ja)
* [JSON Schema](https://json-schema.org/)
* [MarkLogic](https://jp.marklogic.com/)
* [MongoDB](https://www.mongodb.com/)
* [Neo4j](https://neo4j.com/)
* [SwaggerおよびOpenAPI](https://swagger.io/)
* [ScyllaDB](https://www.scylladb.com/)
* [TinkerPop w/ Gremlin API](http://tinkerpop.apache.org/)

## エディション

以下の3つのエディションがある模様。

| エディション          | 料金 |
|:---------------------|:-----|
| Professional Edition | 買い切りだと1500ユーロ（18万円くらい）。別途、サブスク購入もあり。 |
| Personal Edition     | 初期費用150ユーロ（1万8千円くらい）+1年ごとに30ユーロ（4千円くらい） |
| Community Edition    | 無料 |

Community Editionは、次のような機能制限があります。

* 25オブジェクトまでの制限
* フォワードエンジニアリング・リバースエンジニアリングができない
* HTMLドキュメントのエクスポートができない（PDFのエクスポートは可能）
* コマンドラインインターフェース（CLI）が使用できない

本記事では、Community Editionを使用します。

**（2020/4/21追記）上記のように25オブジェクトまでとなっているのは、つまり、データベースやコレクション（テーブル）、フィールド（スキーマ）などをすべてひっくるめて、25個までしか作れないという意味でしたので、無料版は、実際にはほとんど使い物にならない気がしました。。。**

# インストール

[ダウンロードページ](https://hackolade.com/download.html)から、お使いの環境にあったものをダウンロードします。
ここでは、Windows 64bit版のインストーラをダウンロード。

![インストーラファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/494a7e1f-6978-e35e-ebd7-f56105272a28.png)

ダウンロード出来たら、そのまま起動し、ウィザードに沿ってインストールしていきます。

![ウィザード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/98a41d67-79b2-e470-b32e-a414aafae6e5.png)

特別な質問は特にありませんので、そのままポチポチしていけば、インストール完了します。

そのまま、Hackoladeを起動します。

初回起動時は、ライセンスキーの検証が必要である旨のメッセージが表示されますので、**Request a FREE Community edition License Key**を選択し、**Send**ボタンをクリックします。

![ライセンスキーの検証](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/0cd05686-e671-02d2-0ff2-795123b4ce6c.png)

すると、ブラウザが起動し、ライセンス購入のページへ遷移します。

![ライセンスの購入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/3fa006c8-f014-a65b-d11f-2942c831f674.png)

そのまま、購入手続きを進めます。購入といっても、Community Editionですので、0円です。

購入が完了すると、メールでライセンスキーが送られてきますので、先ほどのライセンスキーの検証メッセージで、**Validate a License or Renewal Key**を選択し、**License key:**欄に、ライセンスキーを貼り付けて、**Send**をクリックします。

以上で、インストール完了です。

# 新しいモデルを作る

本記事では、Firestoreを例に、新しいモデルを作ってみます。

トップ画面の、**New model**をクリックします。

![トップ画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/0179c1b0-f98b-f6f8-ae96-5ee96f99081f.png)

モデルのタイプを聞かれます。初期では、「JSON」「Couchbase」「DynamoDB」「MongoDB」のみが選択できます。
Firestoreを含め、他のタイプのモデルを作りたい場合は、そのタイプのプラグインを導入する必要がありますので、**Install plugin for another target**をクリックします。

![モデルタイプ選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/9cefc229-f39c-78ca-e481-9b27341317cd.png)

プラグインマネージャが開きます。導入したいプラグイン（今回であればFirestore）の、**Install**をクリックすることで、導入できます。

![プラグインマネージャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/b9198ab6-8fa6-3528-e334-6de86ba0fce6.png)

再起動を促されますので、そのまま再起動しましょう。

![再起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/4bdd054e-a31d-c236-4087-beaffebc506a.png)

再起動後、トップ画面からもう一度**New model**をクリックすると、タイプが増えていますので、それをクリックし、**Create**をクリックします。

![モデルタイプ選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/d87dc8e9-f567-d6d4-47b3-1c6cf8d1759f.png)

すると、まっさらなモデルが作られます。

![まっさらなモデル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/3c2707b2-27d6-1d64-d51b-c78a7cc72609.png)

# オブジェクトのプロパティ

まっさらなモデルを作りたての状態ですと、画面右側に、**Properties**というパネルが表示されています。
これは、選択されているオブジェクトに対して、各種パラメータを設定できる部分です。
画面左側の、**Object Browser**を見ると、おそらく「New model」が選択されている状態ですので、今は、ルートとなるモデルそのものについて、いろいろ設定ができます。

![モデルのプロパティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/0963c3aa-efce-645e-5fe7-b2ede3531fb4.png)

# いろいろオブジェクトを追加してみる

引き続き、Firestoreを例にして、オブジェクトを追加してみます。

## データベースの追加

まずは、元となるデータベースを1個追加します。ツールバーに**Add database**ボタンがありますので、クリックします。

![Add database](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/3d28515e-8cc0-0a76-7b34-9c9a05182de0.png)

すると、「New database」という名前で、新しいデータベースが作られます。
プロパティパネルで、そのまま名前を変えてしまいましょう。（ここでは、「サンプルデータベース」という名前に変えました。）

![新しいデータベース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/fd890fd0-9966-9a67-fc70-11064023f24d.png)

## コレクションの追加

続いてコレクション（RDBでいうところのテーブル）を追加します。
追加先のデータベースを選択した状態で、ツールバーの**Add collection**ボタンをクリックします。

![Add collection](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/b2dcab72-52c4-6f29-d89e-0b23a5479465.png)

すると、「New collection」という名前で、新しいコレクションが作られます。
プロパティで名前を変えましょう。（ここでは、「user」という名前に変えました。）

![新しいコレクション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/43c50dfb-806d-08fc-129d-6b2962ae40cf.png)

## フィールドの追加

続いて、コレクションに対して格納されていくドキュメント内の、フィールド（RDBでいうところのスキーマ）を追加します。
先ほど作ったコレクションにはすでに、「^[a-zA-Z0-9_.-]{20}$」という名前のフィールドが1個作られています。これは、FirestoreのSDKなどで、`set()`メソッドを使ってドキュメントを新規作成した際に、自動で割り当てられるIDを表しています。

新しく、1個フィールドを追加してみます。
追加先のコレクションを選択した状態で、ツールバーの**Add Attribute**をクリックします。

![Add Attribute](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/5e12e81f-c5f4-3405-68f0-8e569f747fdf.png)

すると、「New field」という名前で、新しいフィールドが作られます。
プロパティで名前を変えましょう。（ここでは、「name」という名前に変えました。）

![新しいフィールド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/6a2d6e50-f57c-25d2-2cb0-ddd92799c1dc.png)

Firestoreは、string型、number型などに加えて、object型を扱うこともできます。
ですので、フィールドに対して、サブフィールドを追加することもできます。

![サブフィールド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/86002a8f-72ef-15dd-62ec-8893c3e4c772.png)

## サブコレクションの追加

続いて、サブコレクションを追加してみます。

追加先となるコレクションを選択した状態で、ツールバーの**Add Child Collection**をクリックします、

![Add Child Collection](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/30c54e6a-487b-a17b-b869-7e0ae6917c7f.png)

すると、「New collection」という名前で、新しいサブコレクションが作られます。

![新しいサブコレクション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/fda2d4e3-9760-8eb1-9f33-ca7b8d6ee3a1.png)

# いったんここまで

もうちょっと使ってみて、何か気づいた点がありましたら、追記いたします。