これまでのモジュールでは、データベースの概念を紹介し、データベースが保存するデータの種類を説明し、データを取得するためにREST APIリクエストを送信する練習をしました。同時に、私たちはこのプロセスの外部参加者にとどまり、さまざまなソースから情報を要求するのみでした。

データベースを作成する時が来ました!このモジュールでは、まさにそれを実行します。データがデータベースにどのように格納され、それらがどのように相互接続されるかを理解します。しかし、まず最初に、理論から始めましょう。データがどのような形でやってくるのか、また、データ構造によってデータベースがどのようなカテゴリに分類されるのかについて扱っていきましょう。

データの基本

データ表現

REST APIにおけるデータ表現の絶対的なリーダーは、JSON形式です。これまでのモジュールで紹介した例では、すべてこの形式でデータを受け取っています。RESTはデータ形式の選択に制約を課さないので、将来的には他の形式(たとえばXMLなど)にも出会えるはずです。同時に、軽量で人間が読みやすいことから、開発者はしばしばJSONを好みます。

JSON(JavaScript Object Notation)は、JavaScriptをベースとしたテキストベースのデータ交換フォーマットである。タイトルにあるJavaScriptに惑わされないでください。JSON形式は、このプログラミング言語に由来するものの、それとは完全に独立しており、どこでも使用することができるのです。

JSONオブジェクトがどのように構成され、どのように記述されるかを見てみましょう。

受信したデータはすべて中括弧「{}」で囲まれています。これらは常にJSONオブジェクトの最初と最後に配置されます。

オブジェクト自体は、「キー:値」のペアで、カンマ「,」で区切られたレコードの集合で構成されています。

キーは、引用符「"」で囲まれたエントリ自体の名前である。例として"name"、"value"、"region"、"address".どんな言葉でも構いませんが、開発時のポイントはこの意味が明確になるようにすることです。

値にはさまざまな種類があります。それらをまとめて考えてみましょう。

  1. 文字列。テキスト情報を含み、ユニコード規格の文字の集合です。文字列は引用符「"」で囲まれます。
  2. 数値。整数でも浮動小数点でもよい。そのまま書くので、引用符で囲む必要はない。
  3. ブール値。2つの値のどちらか。真か偽のどちらか。数値と同様、引用符を付けずに記述する。
  4. 配列。要素の順序付きセット。各要素は任意の型にすることができます。配列は角括弧 "[]" で囲まれ、その要素はカンマで区切られる。
  5. オブジェクトです。JSONの値は、別のJSONオブジェクトにすることができます。これには、ルート・オブジェクトと同じルールが適用されます。また、中括弧で囲まれ、それ自身のレコードのセットを含んでいます。

この情報を頭に入れながら、最初のモジュールで受け取ったデータを見てください。JSONコンポーネントを選択し、受け取った値がどのタイプに属しているかを判断してください。

データを格納する

ここまでで、JSONを扱うことができました。次は、本題のデータベースに移ります。データベースには、さまざまな方法でデータを格納することができます。しかし、歴史的に見ると、リレーショナルデータベースが最も広く普及している。

リレーショナルモデルを使用する場合、データはテーブルの形で保存され、その構造はデータベース設計の段階で厳密に指定された特定のデータセットで構成されます。リレーショナルデータベースにおけるデータ構造の記述をスキーマと呼ぶ。スキーマは、テーブルの構成、テーブル内のフィールドの構造、テーブル間の関係などを定義する。

DBMSは、リレーショナルモデルでデータを管理するためにSQL言語を使用する。

SQL - Structured Query Language(構造化クエリー言語)。宣言型言語なので、コマンドには必要な動作(データを探す、削除する、変更する)だけを記述し、その実行方法は各DBMSが独自に決定する。

リレーショナルDBMSには様々なものがある。代表的なものには、Oracle、MySQL、MS SQL、PostgreSQLがある。ちなみに、AppMasterはPostgreSQLを使用しています。これは、非常に多くの異なる組織で動作し、またフリーソフトウェア(つまり、使用するために追加料金を支払う必要がない)である、最新の高度なDBMSを使用していることを意味します。

ほとんどすべてのDBMSの名前にSQLという略語があることにお気づきでしょうか?実は、リレーショナルデータベースの別名がSQLデータベースなのです。

しかし、それとは別のアプローチもあります。ノンリレーショナルデータベース、つまりNoSQLです。注目すべきは、この場合のNoは「ない」の否定ではなく、Not onlyの省略形であること。つまり、「SQLだけではない」。

非リレーショナルDBMSは(SQLのような)共通のクエリーフォーマットを使用せず、それぞれが独自のデータ処理方法を実装している。

また、データの格納構造も独自に定義する必要はない。データ自体は厳密なテーブルの形ではなく、(JSONのような)任意の属性セットを持つオブジェクトの形で保存される。これは、構造が頻繁に変更されるようなデータを扱う場合に関係すると思われる。

同時に、その自由な構造により、複数のサーバーに分散したデータベースを作成する必要がある場合、NoSQLソリューションは拡張が容易である。

NoSQL DBMSの例としては、MongoDBやRedisなどがある。

データベースの設計

いよいよデータベースを設計します。これを行うには、左パネルの「データ設計Data Designer)」タブに移動します。

データベースのデータは、特別なテーブル(モデル)の形で保存されます。そして、すでに1つのモデルを持っていることにお気づきでしょう。これはauthorizationモジュールの一部であり、デフォルトですべてのプロジェクトに含まれています。このモデルのおかげで、アプリケーションの新しいユーザーが作成され、既存のユーザーが管理されます。しかし、今はその研究に没頭するのではなく、独自のモデルを作成することにします。

地図サービスを開発することを想像してください。国に関する情報を含むモデルを作ってみましょう。作成するには、キャンバスの何もないところで右クリックし、「空のモデルを作成」を選択する必要があります。

作成には、モデルの名前を指定するだけです。エンドポイントやユーザーインターフェース要素の自動生成については、このコースのさらなるモジュールで扱う予定です。

作成直後、モデルにはすでに4つのフィールドが含まれていることに注意してください。これらはシステムフィールドで、これがあると、モデルの初期作成とその後の利用が非常に簡単になります。

  1. ID (integer) - 一意な識別子、プライマリキー。テーブルの新しいエントリごとに自動的に作成され、重複がないことを保証するためのものである。テーブル内のレコードを一意に識別できるのは、このIDによるものである。この値は 1 から始まり、新しいエントリーが作成されるたびに自動的に 1 ずつ増えていきます。
  2. CreatedAt (datetime) - テーブルにレコードが作成された時間。
  3. UpdatedAt (datetime) - レコードが最後に修正された時間。
  4. DeletedAt (datetime) - エントリが削除された時間です。もちろん、ソフト削除が使用された場合のみです。つまり、そのような削除は、レコードが削除されたとマークされ、それへのアクセスの要求によってフィルタリングされるだけで、同時に物理的にテーブル内に残っている場合です。これは、実際にデータを完全に削除する一括削除とは異なる。

システムのものに加えて、作成されたモデルにカスタムフィールドを追加するのが賢明でしょう。たとえば、国の名前とその国に関する情報を含む説明文を表示したいとします。

フィールドのタイプを選択することは問題ではありません。名前にはString、情報としての説明文にはTextが適しています。


さらに、4つのスイッチも用意されています。

  1. 複数の値 (配列) - 単一項目ではなく、配列を使用します。
  2. Not null - 指定されたフィールドは空であってはならず、常にデータを含む必要があります。
  3. 一意 - フィールドの値は一意でなければなりません。このモデルでは、このフィールドの値が同じであるレコードは2つ存在してはなりません。
  4. インデックス - 検索を高速化するために、このフィールドに特別なインデックスを作成することを示す。

一般的には、本当に必要な場合のみ、マークをチェックするのが正しい。たとえば、名前のない国や、同じ名前の国が2つ存在することはありえないとして、国名に対してNot nullとUniqueをマークすることができます。ただし、これはアプリケーションのロジックを作る段階で制御して、データベース自体に制限をかけないようにするのがよいでしょう。

同様に、都市に関する情報を持つテーブルを作成します。どのようなデータフィールドを含むことができるのか、これらのフィールドはどのようなタイプなのか、考えてみてください。

データベースの中のデータは、ばらばらのテーブルという形で単独で存在しているわけではありません。それらは互いに一定の関係を持っている。データモデルを開発する上で重要なのは、このような関係を定義し、関係を構築することである。

このような関係を構築するためには、あるモデルの境界から別のモデルへマウスで線を引くことが必要である。この例では、各都市がどこかの国にあることが確実に分かっているので、国から都市へのリンクを作成することができます。


接続には3つのタイプがあります。

  1. 1対1(1つしかない)。テーブルの各レコードは、関連するテーブルの1つのレコードにマッピングされます(これは逆にも当てはまります)。簡単な例としては、人物とそのパスポートがある。この接続は常に一意であることを確認できる。パスポートの所持者は1人で、有効なパスポートは1人1枚しか持てないからだ。
  2. 一対多(has many)。あるテーブルの各レコードは、別のテーブルの多くのレコードを持つことができる。私たちのデータベースも同じような例です。ある国は多くの異なる都市を持つことができますが、各都市は1つの国だけに属することができます。これが、私たちが行う接続です。
  3. 多対多。あるテーブルの複数のレコードが、別のテーブルの複数のレコードに対応することができる関係。簡単な例では、教師と生徒の関係があります。各教師は多くの生徒を教えることができ、各生徒は多くの異なる教師から学ぶことができるのと同じです。

宿題

オンラインストアのアプリケーションを開発しなければならないと想像してください。それが動作するようにデータベースモデルを作成します。

  • 商品の説明のカード、商品のさまざまなカテゴリ、注文に関する情報、顧客に関する情報など、商品の可用性を提供することが必要です。
  • テーブルには、さまざまなタイプのフィールドを設定します (最低でも 5 つのタイプを使用します)。
  • テーブル間のリレーションシップを確立する。3つのリンクタイプすべてを使用する。