データベースの体験
この章で学ぶこと
データベースの体験をします。
データベースとは
今回は、外部のサーバーにデータを保存してやり取りすることで Unity 側のコンテンツと連携することを学びます。
今回はその中でもデータ検索やデータ蓄積に長けた「データベース」を試していきましょう。
- データベース - Wikipedia
最近はデータベースの範囲は広いですが、今回はその中でも RDS(リレーショナルデータベース)という、 データの入れ物を用意し(テーブル)、テーブルにデータのルール定義(カラム)をして、データ検索やデータ蓄積を行うところに焦点を当てます。
たとえば、こんなデータです。
カラム1 | カラム2 | カラム3 | カラム4 |
---|---|---|---|
文字列 | 数値 | JSON | BLOB |
文字列 | 数値 | JSON | |
文字列 | 数値 | JSON |
「データを保存する」観点の他の用語
他にも「ストレージ」や「ファイルサーバー」といったデータを保存するときに良く出てくる用語があります。
ストレージはデータの記憶領域全般を指す言葉です、そこにデータベースやファイルサーバーなどの仕組みを作ることで、より用途に合ったデータ管理ができるようになります。
データ管理として、ファイルサーバーは、ファイルパスや URL などでデータが取得できる仕組みで 3D コンテンツで言うとテクスチャやキャラクターの絵素材を管理する用途に向いています。
データベースサーバーは、データのルールを定義してデータ検索やデータ蓄積をしやすくする仕組みで、ゲーム自体のデータの管理やユーザーごとのデータ管理をすることに向いています。
Codespaces の更新
授業をはじめる前に Codespaces の更新を行いましょう。
サーバの起動
- ターミナルで
npx node-red -u week05-chapter01
をサーバ起動 - ポートタブで今回のサーバ起動を公開(1880 ポートのほう)
- シークレットウィンドウで今回のサーバが公開されているか確認します
こちらの手順を進めます。
✅ポイント
- JSON Server https://github.com/typicode/json-server という JSON データファイルをそのまま簡易データベースとして使う仕組みが Node-RED 起動時に一緒に起動しています
- 本来、データベースの仕組みを作ることは手間がかかりますが、今回は「データを読み込み・作成・更新・削除」を手軽に体験するために JSON Server を使っています
- Node-RED は、今回 JSON Server 自体のサーバー構造にそのままデータを通しています
JSON Server のデータの持ち方
JSON Server https://github.com/typicode/json-server のドキュメントにあるように、
{
"posts": [
{ "id": "1", "title": "a title", "views": 100 },
{ "id": "2", "title": "another title", "views": 200 }
],
"comments": [
{ "id": "1", "text": "a comment about post 1", "postId": "1" },
{ "id": "2", "text": "another comment about post 1", "postId": "1" }
],
"profile": {
"name": "typicode"
}
}
といったサンプルデータの場合、トップレベルにあるプロパティ posts,comments,profile が、そのままデータベースのテーブルとして使えます。テーブルというのは、あるルールに従ったデータのかたまりです。
- 表 (データベース) - Wikipedia
関係データベースやフラットファイルデータベースにおける表(ひょう)またはテーブル(英語: table)とは、データ要素(値)の集合を垂直な列と水平の行のモデルで構成したものである。表には所定の個数の列があるが、行数は不定である。各行は特定の列の値で識別され、それを候補キーと呼ぶ。
posts というテーブルの場合は
- posts
- id という文字列のデータが入る列
- title という文字列のデータが入る列
- views という数字が入る列
で構成されています。
id | title | views |
---|---|---|
1 | a title | 100 |
2 | another title | 200 |
2 行分のデータが入っています。
comments というテーブルの場合は
- comments
- id という文字列のデータが入る列
- text という文字列のデータが入る列
- postId という文字列が入る列
で構成されています。
id | text | postId |
---|---|---|
1 | a comment about post 1 | 1 |
2 | another comment about post 1 | 1 |
2 行分のデータが入っています。
profile は、行と列で構成されているテーブルではなく固有データが取得できます。これは json-server の仕様です。
JSON Server のデータの呼び出し方
HTTP メソッドに合わせてデータが取得できます。
ドキュメントの例では posts の場合、以下のようになります。
- GET メソッド
- データの取得
- http://localhost:3000/posts
- POST メソッド
- データの作成
- http://localhost:3000/posts
- PUT メソッド
- データの更新
- http://localhost:3000/posts
- データ
{"id":"1","title":"patched!"}
で id 1 を全更新
- DELETE メソッド
- データの削除
- http://localhost:3000/posts
- データ
{"id":"1"}
で id 1 を削除
- PATCH メソッド
- データの一部更新
- データ
{"id":"1","title":"patched!"}
で id 1 を一部 title 更新
今回のデータ
今回のデータは ./week05-chapter01/db/db.json にデータがあります。
{
"sample01": [
{
"id": "1",
"data": "データ1"
}
]
}
sample01 というテーブルで、いまは
- sample01
- id という文字列のデータが入る列
- data という文字列のデータが入る列
で構成されています。
id | text |
---|---|
1 | データ1 |
1 行分のデータが入っています。
ブラウザから GET メソッドでデータの取得をしてみる
ポートタブで 1880 で動いているほうのローカルアドレスをコピーします。
<Node-RED サーバーのアドレス>/sample01
で sample01 テーブルにアクセスしてみましょう。
このようにブラウザで sample01 テーブル のデータが見れます。
Node-RED で GET メソッドでデータの取得をしてみる
実は今回のフローでは「お試し」というタブがあり Node-RED 側からデータをお試しできます。
GET データ取得とコメントが書かれている下の inject ノードをクリックしてみましょう。さきほどのブラウザでの GET リクエストと同じことが起こります。
デバックタブでデータが取得できていることが確認できます。
Node-RED で POST メソッドでデータの登録をしてみる
POST データ追加とコメントが書かれている下の inject ノードをクリックしてみましょう。
このように API 設定を見ると data に「データ2」という値が追加されます。
デバックタブで追加されたデータが確認できます。今回の cbef という値は、みなさんそれぞれのランダムなものです。
week05-chapter01/db/db.json
の中身が実際に更新されることも確認しましょう。
Node-RED で DELETE メソッドでデータの削除をしてみる
DELETE データ削除とコメントが書かれている下の inject ノードをクリックしてみましょう。
API 設定を見ると URL に /1 をつける形で ID 1 のデータが削除されます。
データが削除されると今回削除されたデータ内容が返ってきます。
GET で確認してみるとデータが削除されていることが確認できます。
エクストラ:データの更新 PUT PATCH
はじめに、何度か POST でデータ追加をして GET で更新したい id を決めて更新を試しましょう。
PUT は全体更新です。対象の id に対してデータを上書きします。上書きするので、今まであった値でも今回更新しないデータは消えてしまいます。
PUT データ全体更新とコメントが書かれているフローを確認します。
今回のフローの API 設定をダブルクリックして内容を見て http://localhost:3000/sample01/1 の 1 の部分を更新したい ID に書き換えて完了をクリックしてデプロイします。
タイムスタンプと書かれた inject ノードをクリックしてみましょう。
データが更新されたことを確認しましょう。
PATCH は部分更新です。対象の id に対してデータを上書きしますが PUT と違い、プロパティ名が一致した値だけを更新します。
今回の Codespace の終了
今回の Codespace 終了しておきましょう。
Unity プロジェクトの更新
次の授業をはじめる前に Unity プロジェクトの更新を行いましょう。