Skip to Content
Featuresスキーマテーブルモジュール

テーブルモジュール

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

基本概念

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

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

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

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

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

スキーマの定義

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

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

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

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

orizm.config.ts
import { defineConfig } from "@orizm/cli/config"; // ① tableModules に imageWithCaption モジュールを定義 // ② tables に blog テーブルを定義 // ③ blog のカラム imageGallery に imageWithCaption モジュールを関連付け export default defineConfig({ tableModules: { // ① imageWithCaption: { columns: { image: { type: "storage", }, caption: { type: "string", }, }, }, }, tables: { // ② blog: { columns: { title: { type: "string", required: true, }, body: { type: "string", }, // ③ imageGallery: { type: "module-array", moduleName: "imageWithCaption", }, }, }, }, });

予約カラム

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

id

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

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

_parentId

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

_order

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

フィルタ

SDKから list() でクエリする際、module-array 型のカラムに対して someeverynone 演算子を使用して配列要素を条件にフィルタリングできます。詳細は CMS SDKのフィルタ または Consumer SDKのフィルタ を参照してください。

注意事項

  • カラム名とモジュール名を同じにすることはできません。
  • 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
Last updated on