テーブルモジュール
テーブルモジュール(以下、モジュール)は、データベースで複雑なデータ構造を表現するための機能です。
基本概念
モジュールを利用すると、リレーショナルデータベースでは通常表現できない階層構造やリスト構造を表現できます。
モジュールは以下のデータ型のカラムで使用できます。
- module型: カラムに対して1つのデータを関連付けます。(1:1)
- module-array型: カラムに対して複数のデータを関連付けます。(1:N)
モジュールの特徴は以下の通りです。
- 再帰的にネスト可能
- テーブルと同様にreference型やインデックス、ユニーク制約を設定可能
- 検索条件としてモジュールのカラムを指定可能
スキーマの定義
まず、スキーマの tableModules
プロパティでモジュールを定義します。モジュールの定義は基本的にテーブルと同様です。テーブルの定義方法については データベース を参照してください。
モジュールを定義したら、テーブルのカラム定義で module
または module-array
型を指定してモジュールを関連付けます。
注意
カラム名とモジュール名を同じにすることはできません。
以下は、画像ギャラリーを持つブログ記事を表現するスキーマの例です。
// ① tableModules に imageWithCaption モジュールを定義
// ② tables に blog テーブルを定義
// ③ blog のカラム imageGallery に imageWithCaption モジュールを関連付け
const config = {
tableModules: [
{
name: "imageWithCaption", // ①
columns: [
{
name: "image",
type: "storage",
},
{
name: "caption",
type: "string",
},
],
},
],
tables: [
{
name: "blog", // ②
columns: [
{
name: "title",
type: "string",
required: true,
},
{
name: "body",
type: "string",
},
{
name: "imageGallery", // ③
type: "module-array",
moduleName: "imageWithCaption",
},
],
},
],
};
予約カラム
module
と module-array
型には以下の予約カラムがあります。
id
モジュールのデータを一意に識別するためのIDです。ランダムな16文字の英数字で構成されます。(例: MlKtexCT1v8CS4pR
)
id には自動で インデックス が作成されます。
_parentId
親レコードのIDを持ちます。
_order
リストの並び順です。module-array型にのみ存在します。
注意事項
- カラム名とモジュール名を同じにすることはできません。
- SDKから
list()
でクエリする際、order
パラメータでモジュールのカラムを指定できません。 module
とmodule-array
型はrequired
の指定ができません。- モジュールのデータには直接アクセスできません。必ずレコードを通してアクセスする必要があります。
reference型との違い
reference型は他のテーブルのレコードを参照する際に使用します。module型に近い性質を持ちますが、以下のような目的の違いがあります。
- reference: 異なるテーブルのレコードとの関連付け
- module: 1レコード内での階層構造やリスト構造の実現
モジュールにはテーブルとしての実体は無く、レコードの内部にデータを持ちます。reference型では参照先のレコードは独立して存在できますが、モジュールは親レコードが存在しないと自身も存在できません。
以下のように使い分けることができます。
reference型が適するケース
- 一般的なリレーショナルデータベースのリレーションで表現したいケース
- 複数のテーブルから参照するケース
module型が適するケース
- NoSQLライクなドキュメント構造を型安全に表現したいケース
- 親レコードに従属するデータを表現したいケース
json型との違い
json型を使うことで、モジュールのような階層構造やリスト構造を持つデータを扱うことができます。
異なる点として、json型は生成されるTypeScript型定義が unknown
になるため、アプリケーション側で型定義やバリデーションを行う必要があります。モジュールはスキーマ定義に基づいて型定義が生成されるため、型安全にデータを扱うことができます。
以下のように使い分けることができます。
- 複雑な型を手軽に扱いたい:
json
- 型安全にデータを扱いたい:
module
,module-array