データモデル
概念モデル図
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 にはセクションの概念がないため、「提示ステップ」を区切りとしてセクション候補に分割する