コンテンツにスキップ

question_library_items

概要

過去質問データ(質問ライブラリ)を管理するテーブル。自システムの案件由来と、CS から取り込んだ調査票由来の 2 系統がある。

テーブル定義

論理名 物理名 カラム名 データ型 主キー リレーション ユニーク NULL許可 デフォルト値 備考
過去質問データ question_library_items id uuid ◯ gen_random_uuid()
source_survey_id uuid surveys:id (cascade) ◯ 内部由来の元案件
source_question_id uuid ◯ 内部由来の元設問。外部キー制約なし
source_external_survey_id uuid external_surveys:id (cascade) ◯ 外部由来の元調査票
source_external_question_id uuid external_questions:id (cascade) ◯ ◯ 外部由来の元設問
category varchar(255) カテゴリ。検索の絞り込みに使う
section_title varchar(255) 元のセクションタイトル
question_type question_type single / multi / free_text / matrix / intro / pulldown
normalized_payload jsonb 正規化された設問内容
created_by uuid users:id (set null) ◯ 登録者
created_at timestamptz now()

リレーション

  • source_survey_id → surveys.id (onDelete: cascade)
  • source_external_survey_id → external_surveys.id (onDelete: cascade)
  • source_external_question_id → external_questions.id (onDelete: cascade)
  • created_by → users.id (onDelete: set null)

インデックス

  • 主キー (id)
  • UNIQUE INDEX: question_library_items_external_question_idx (source_external_question_id)

制約

  • CHECK: question_library_items_source_required — source_survey_id か source_external_survey_id のいずれかが必須

normalized_payload の構造

{
  "promptText": "以下のうち、知っているブランドをすべてお選びください。",
  "options": [
    { "label": "ブランド A", "isExclusive": false, "allowOtherInput": false, "isNotApplicable": false }
  ],
  "subItems": [{ "label": "満足度" }],
  "subQuestions": [
    { "label": "平日", "options": [{ "label": "毎日", "isExclusive": false, "allowOtherInput": false, "isNotApplicable": false }] }
  ]
}
フィールド 必須 内容
promptText ◯ 設問文
options ◯ 選択肢
subItems サブ項目(マトリクスの列など)。ラベルのみ
subQuestions サブ設問(ラベル + 選択肢)

注記

  • 登録タイミング: 案件の JSON 出力時(同じ案件の既存登録は削除して再登録)、および CS からの取り込み時
  • 分岐は保存されない: 正規化ペイロードには分岐ルール・表示ロジックが含まれないため、流用後にあらためて設定する必要がある
  • source_question_id に外部キーを張らない理由: 版の複製でスナップショット行の id が変わるため、外部キー制約を張ると版の保存時に整合が取れなくなる。流用時は安定 ID を辿って対応する設問を探す
  • 元案件が削除済みでも流用できる: 内部由来の流用では、元案件が削除されていてもスナップショット行が残っていれば設問を復元して流用する
  • 削除できるのは管理者のみ。created_by に登録者が記録されるが、削除の可否には影響しない