0

調査の質問 (s_questions) と可能な回答 (s_option_choices) のデータベースには、ルックアップ テーブル (s_question_options) があります。

構文を作成します。

CREATE TABLE `s_question_options` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`questions_id` int(11) unsigned NOT NULL,
`option_choices_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `questions_id` (`questions_id`),
KEY `option_choices_id` (`option_choices_id`),
CONSTRAINT `s_question_options_ibfk_1` FOREIGN KEY (`questions_id`) REFERENCES `s_questions` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `s_question_options_ibfk_2` FOREIGN KEY (`option_choices_id`) REFERENCES `s_option_choices` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1790 DEFAULT CHARSET=utf8;

次のように入力されます。

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq
JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id;

s_option_choices新しい/変更された/削除された可能性のある回答で更新する場合、どの構文がルックアップ テーブルを更新してs_question_options、現在の質問が利用可能になり、古い回答 (回答テーブルに保存され、 を介して参照されるs_question_options_id) が引き続き正しく参照されるようにしますか?

編集

次のようにして、新しい質問または新しい option_choices をルックアップ テーブルに追加できます。

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id
WHERE sq.id NOT IN (SELECT questions_id FROM s_question_options)
OR so.id NOT IN (SELECT option_choices_id FROM s_question_options)

これは、ルックアップ テーブルを作成するために最初に使用されたものと同じ選択クエリですが、a) 入力された質問が以前に入力されていない、または b) option_choice が以前に入力されていないという条件があります。

option_choices を変更することは必須ではありません。意味がなく、参照整合性のゲームには関係ありません。

option_choices の削除は、回答テーブルの外部キー (id) ON DELETE SET NULL で解決できます。これは事実上、option_choice が削除された質問への回答を NULL に設定し、私のアプリケーションでは、これを探してそれに応じて行動することができます (質問が回答されていないか、現在は無関係なデータで回答されています)。

提案されたように、option_choices テーブル (またはアプリ内の option_choices の配列) に表示フラグを設定して、これらの option_choices がフォームに表示されないようにすることもできますが、データはデータベースに保持されます。

調査データベースの設計

4

2 に答える 2

0

私のソリューションの編集を参照してください。

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id
WHERE sq.id NOT IN (SELECT questions_id FROM s_question_options)
OR so.id NOT IN (SELECT option_choices_id FROM s_question_options)
于 2013-05-23T22:46:12.417 に答える