Featuresスキーマテーブルモジュール

テーブルモジュール

テーブルモジュール(以下、モジュール)は、データベースで複雑なデータ構造を表現するための機能です。

基本概念

モジュールを利用すると、リレーショナルデータベースでは通常表現できない階層構造やリスト構造を表現できます。

モジュールは以下のデータ型のカラムで使用できます。

  1. module型: カラムに対して1つのデータを関連付けます。(1:1)
  2. module-array型: カラムに対して複数のデータを関連付けます。(1:N)

モジュールの特徴は以下の通りです。

  • 再帰的にネスト可能
  • テーブルと同様にreference型やインデックス、ユニーク制約を設定可能
  • 検索条件としてモジュールのカラムを指定可能

スキーマの定義

まず、スキーマの tableModules プロパティでモジュールを定義します。モジュールの定義は基本的にテーブルと同様です。テーブルの定義方法については データベース を参照してください。

モジュールを定義したら、テーブルのカラム定義で module または module-array 型を指定してモジュールを関連付けます。

⚠️

注意
カラム名とモジュール名を同じにすることはできません。

以下は、画像ギャラリーを持つブログ記事を表現するスキーマの例です。

orizm.config.ts
// ① 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",
        },
      ],
    },
  ],
};

予約カラム

modulemodule-array 型には以下の予約カラムがあります。

id

モジュールのデータを一意に識別するためのIDです。ランダムな16文字の英数字で構成されます。(例: MlKtexCT1v8CS4pR

id には自動で インデックス が作成されます。

_parentId

親レコードのIDを持ちます。

_order

リストの並び順です。module-array型にのみ存在します。

注意事項

  • カラム名とモジュール名を同じにすることはできません。
  • SDKから list() でクエリする際、order パラメータでモジュールのカラムを指定できません。
  • modulemodule-array 型は required の指定ができません。
  • モジュールのデータには直接アクセスできません。必ずレコードを通してアクセスする必要があります。

reference型との違い

reference型は他のテーブルのレコードを参照する際に使用します。module型に近い性質を持ちますが、以下のような目的の違いがあります。

  • reference: 異なるテーブルのレコードとの関連付け
  • module: 1レコード内での階層構造やリスト構造の実現

モジュールにはテーブルとしての実体は無く、レコードの内部にデータを持ちます。reference型では参照先のレコードは独立して存在できますが、モジュールは親レコードが存在しないと自身も存在できません。

referenceとmoduleの違い

以下のように使い分けることができます。

reference型が適するケース

  • 一般的なリレーショナルデータベースのリレーションで表現したいケース
  • 複数のテーブルから参照するケース

module型が適するケース

  • NoSQLライクなドキュメント構造を型安全に表現したいケース
  • 親レコードに従属するデータを表現したいケース

json型との違い

json型を使うことで、モジュールのような階層構造やリスト構造を持つデータを扱うことができます。

異なる点として、json型は生成されるTypeScript型定義が unknown になるため、アプリケーション側で型定義やバリデーションを行う必要があります。モジュールはスキーマ定義に基づいて型定義が生成されるため、型安全にデータを扱うことができます。

以下のように使い分けることができます。

  • 複雑な型を手軽に扱いたい: json
  • 型安全にデータを扱いたい: module, module-array