コンテンツにスキップ

データモデル

概念モデル図

erDiagram
  ユーザー ||--o{ 案件 : "作成する"
  ユーザー ||--o{ 権限 : "付与される"
  案件 ||--o{ 権限 : "共有する"
  案件 ||--o{ 版 : "履歴として持つ"
  版 ||--o{ セクション : "含む"
  セクション ||--o{ 設問 : "含む"
  設問 ||--o{ 選択肢 : "持つ"
  設問 ||--o{ 分岐ルール : "持つ"
  設問 ||--o{ 表示ロジック : "持つ"
  分岐ルール ||--o{ 分岐条件 : "含む"
  表示ロジック ||--o{ 表示条件 : "含む"
  表示ロジック ||--o{ 非表示対象 : "指定する"
  案件 ||--o{ 過去質問データ : "出力時に登録する"
  外部調査票 ||--o{ 外部設問 : "含む"
  外部調査票 ||--o{ 過去質問データ : "取り込み時に登録する"

エンティティ概要

エンティティ名 説明
ユーザー システムを利用する人。認証時に自動作成される
案件 調査票の入れ物。テーマ・ステータス・最新版番号を持つ
権限 ユーザーが案件に対して持つ役割(閲覧/編集)
版 案件の内容のスナップショットの単位。保存のたびに増える
セクション 調査票の大問。版に属する
設問 セクション内の質問。設問コードで一意に識別される
選択肢 設問の回答候補。マトリクスの行/列、FA の入力欄も同じ実体で表す
分岐ルール 条件が成立したときに移動する先を定める
分岐条件 「どの設問の回答がどういう状態か」を表す条件
表示ロジック 条件が成立したときに選択肢を非表示にする
非表示対象 表示ロジックで隠される選択肢
過去質問データ 流用のために蓄積された設問。自案件由来と外部由来がある
外部調査票 / 外部設問 Creative Survey から取り込んだ調査票と設問

ビジネスルール

案件と版

  • 調査票の内容は案件ではなく 版に紐づくスナップショット として保存される
  • 編集は常に最新版に対して行われ、過去の版は変更されない
  • 保存すると、最新版の全内容を複製した新しい版が作られる
  • ロールバックは過去の版を書き戻すのではなく、その内容を復元した新しい版を作る
  • 版が変わるとセクション・設問の行 ID は振り直されるが、安定 ID は引き継がれる

設問と選択肢

  • 設問コードは案件内で一意。分岐条件と分岐先の参照キーになる
  • 設問を複製すると新しいコードが振られ、自設問を参照していた分岐は新コードへ付け替えられる
  • 選択肢は設問の更新のたびに削除・再作成されるため ID が安定しない
  • そのため分岐条件・表示ロジックは選択肢を ラベル文字列 で参照する
  • 提示ステップ(intro)は回答欄を持たないため、分岐条件の参照元にできない

分岐と表示ロジック

  • ルールは並び順に評価され、最初に成立したものが採用される(先勝ち)
  • 1 つのルール内の条件は AND または OR で結合する。ネストや混在はできない
  • 分岐先は同一セクション内の後続設問、または SO / SC / SX / 自設問
  • 分岐先が自設問の場合は排他設定となり、メッセージを表示して進行を止める
  • 表示ロジックの条件は分岐条件と同一の構造を持ち、出力が「分岐先」ではなく「非表示にする選択肢」になる
  • not_includes と not_only は未回答でも成立する(Creative Survey の意味論に合わせる)

権限と削除

  • 案件の作成者には編集権限が自動付与される
  • 案件を複製すると、複製元の権限がそのまま引き継がれる
  • 案件の削除は論理削除。実行できるのは作成者本人と管理者のみ
  • セクション・設問の削除は最新版のスナップショットに対する物理削除(過去の版には残る)
  • 管理者は権限レコードの有無に関わらず全案件にアクセスできる

質問ライブラリ

  • 案件を出力すると、その案件の設問が登録される。同じ案件の既存登録は置き換えられる
  • 登録されるのは設問文と選択肢の構造まで。分岐ルール・表示ロジックは含まれない
  • 元の案件が削除済みでも、スナップショットが残っていれば流用できる
  • 過去質問データの削除は管理者のみ(登録者本人でも管理者でなければ削除できない)

外部データ

  • 同じ外部調査票(取得元 + 外部 ID)を再取り込みすると、既存を削除して再投入する
  • Creative Survey の API 仕様は非公開のため、取り込んだ生の JSON をそのまま保持する
  • CS にはセクションの概念がないため、「提示ステップ」を区切りとしてセクション候補に分割する