質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

8087閲覧

質問・回答・回答補足の選択要素があるアンケートフォームのテーブル設計について

kuwana

総合スコア12

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2016/11/24 07:06

編集2016/11/24 14:13

###前提・実現したいこと
質問・回答・回答補足の選択要素があるアンケートフォームのテーブル設計について、どのようにテーブル設計をするべきか悩んでおります。

例えば以下の様なフォームです。

■ Q1.今まで旅行したことある土地は?(選択肢から一つ選ぶ) <選択肢> ○ 北海道 ○ 東京 ○ 長野 ○ 京都 選んだ土地の詳細地域は?(任意) [ input box ]
■ Q2.好きなエディタは?(選択肢から一つ選ぶ) <選択肢> ○ Vim ○ Emacs ○ Atom ○ Sublime Text そのエディタのいいとろこは?(任意/複数選択あり) □ カスタマイズ性 □ 起動の速さ □ 憧れのあの人が使ってる

(例が悪くてすみません。。)

みたいなフォームで、質問内容や回答項目(選択肢)をDBのマスターを更新するだけで可変になるようにしたのです。(あくまで例です)
任意の部分に関しては、

  • チェックボックスを使う質問と、
  • インプットテキストの部分、
  • 任意項目を設けない質問、

の3つがあります。

###やってみた設計

イメージ説明

これで問題ないように思えるんですが、以下が不安要素として残っているので、質問させて頂きました。

  1. 3つテーブルを結合する中間テーブルを扱ったことがない&そのような事例もあまりみない
  2. 回答補足(任意回答項目)の中間テーブル(?)にユーザー入力用のデータをもたせた場合Null許可になって嫌な感じ

より良い設計があるのであれば皆さんのお知恵を頂きたい次第です。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/24 07:17

質問に対する回答の上限数、および、回答に対する回答補足の上限数は設定しますか?
himakuma

2016/11/24 09:06

アンケートごとに補足の有り無しを設定しますか?
sk_3122

2016/11/24 09:07

回答マスタって <選択肢> のことでしょうか? 回答というとユーザが選択した値っぽいイメージがあって少し悩みました。 回答mst の display_name に "北海道" とか入るんですかね…? 質問mst の display_name が "今まで旅行したことある土地は?" でしょうか。 実際に入る値の例とかもあるとイメージしやすい気がします。
kuwana

2016/11/24 14:28

追加・修正依頼有難うございます。質問に対する回答はラジオボタンで1つのみ選択出来る形です。回答補足は上限はなく、質問に対する回答数の上限はありません。アンケート毎に補足の有り無しは設定しますね。それも必要か・・。回答mstは選択肢mstですね・・すみませんわかりにくくて。実際作るシステムはアンケートでは無いのですが、性質は全く同じなので便宜上アンケートフォームとさせて頂きました。
himakuma

2016/11/25 01:15

まとめるとアンケート1に対して質問N個。質問1に対して、回答N個。回答1に対して回答補足N個って感じですかね?
kuwana

2016/11/25 03:30

質問1に対して回答は一つです。回答1に対して補足はN個であってます。またアンケート自体は一つだけで複数アンケートの管理は想定してないですね。
kuwana

2016/11/25 15:02

たくさんの回答ありがとうございました。とても勉強になりました!
guest

回答3

0

ベストアンサー

うーん、私だったらこんな感じですかね…?
(※私は全然 DB 担当とかではないのですが… とりあえず考えてみたやつ)

マスタ
アンケートに複数の質問がぶら下がる。質問に複数の回答がぶら下がる。
補足の場合のみ [親質問ID] が入り、質問に質問がぶら下がる形になる。

【アンケートmst】 ●アンケートID  アンケート名等 【質問mst】 ●アンケートID ●質問ID [UNIQUE]  display_name ← "好きな色は?"  並び順 ← 質問の表示順。Q1, Q2... のナンバリング  回答タイプ ← 単一選択、複数選択、入力  親質問ID ← 補足の場合のみ入る 【選択肢mst】 ●質問ID ●選択肢ID  display_name ← "赤"

トラン

【userアンケート】 ●userアンケートID user_id アンケートID create_at 【userアンケート回答】 ●userアンケートID ●質問ID ●Selected選択肢ID ← ユーザの回答 回答入力値 ← 補足入力値(NULL許可)

こうかなあ・・・?

なお上記は 質問に質問をぶら下げる案を書いてみましたが、
別に 回答補足mst(補足質問mst?)でも良いと思いますよ。
(その場合はトランの構成もまた変わってきますね)

なお上記のように親質問IDで管理する場合、SQL一発でどかっと取ってきたい時は
再帰でSELECTする必要がありますかね

投稿2016/11/25 02:07

編集2016/11/25 06:34
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuwana

2016/11/25 02:24

回答補足マスターを用意するのはユーザー入力だけじゃなく任意のセレクトボックスがあるからですね。よくよく考えたら最初のER図だと質問と回答の紐付けができてないですね。ご指摘ありがとうございます!
sk_3122

2016/11/25 06:27 編集

ああ、「そのエディタのいいとろこは?」は補足なんですね。 なんとなく全体像が分かりました。 回答を修正してみました。 【追記】 複数アンケートを想定してないのか。 なら アンケートmst もいらないっちゃいらないですかね。いきなり質問mstでも良いかな…
kuwana

2016/11/25 15:00

いきなり質問mstで大丈夫ですね!質問を入れ子にする発想はなかったです。並び順や回答タイプありの構成をを具体的に示して頂けたのでなんとかいけそうな形が見えてきました。ありがとうございますm(_ _)m
guest

0

このER図でも良いと思いますが

  1. 3つテーブルを結合する中間テーブルを扱ったことがない&そのような事例もあまりみない

上記の中間テーブルは、トランザクションテーブルの形に似ています。例えば、購買伝票トランザクションテーブルは、商品マスタ、顧客マスタ、店舗マスタの中間に存在する様になります。実際のデータは他のマスタとも連携している場合も有り、3つにこだわる必要は無いかと思います。
私事ですが、不安要素は、利用イメージからテーブル構成が充分であるかの評価作業を行う事で軽減しています。DB担当なので設計もしますが、最初のER図のままで有る事は有りません。(私だけ??)

  1. 回答補足の中間テーブル(?)にユーザー入力用のデータをもたせた場合Null許可になって嫌な感じ

嫌な感じと言われているのは、ER図を描いた成果ではないでしょうか。回答補足マスタは現段階では、マスタ化する必要性が低いのではと考えられます。回答補足は、中間テーブル「質問_回答」の中に置くか、直接ぶら下げても良いかと思います。

投稿2016/11/24 10:19

編集2016/11/24 10:20
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuwana

2016/11/25 02:18

トランザクションテーブル、確かに言われてみればそうですね!利用時に扱いにくくなければ差し支えない程には設計できてそうで少し安心しました。
guest

0

質問1に対して回答は一つです。回答1に対して補足はN個であってます。またアンケート自体は一つだけで複数アンケートの管理は想定してないですね。

であれば
質問と回答のテーブルは別ける意味がないのでは?
複数管理をしないならアンケートマスタも現状は作成する必要性がない気がします。

下記の構成で事足りると思うのですが、どうでしょうか?
■アンケートテーブル(enquete_idとsitumon_kaitou_idでユニーク)
0. id(PK)
0. enquete_id
0. situmon_kaitou_id(FK)

■質問回答mst
0. id(PK)
0. situmon_name
0. situmon_display_name
0. kaitou_name
0. kaitou_display_name

■回答補足(補足の使いまわしがない場合)
0. id(PK)
0. situmon_kaitou_id(FK)
0. name
0. display_name

回答補足の使いまわしがある場合、
質問回答mstと回答補足の間に中間テーブルを作成するか、
マスターのコピー機能を作ればよいと思います。

テーブルが多くなるとどうしても性能劣化するので、
必要以上にテーブルは増やさないほうがいいです。

投稿2016/11/25 05:02

himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuwana

2016/11/25 11:11

回答ありがとうございます。質問回答mstは選択肢(回答)分だけ situmon_name が重複する形になりますよね?んー、、いいのか。マスターと言うからには、項目ごと、一つのデータを管理したいところではありますが、たしかに余りテーブルを増やして後から結合する前提にしてしまうとパフォーマンスに影響があるというのもうなずけます。うーむ。
himakuma

2016/11/25 13:15

テーブルの管理を優先すると分けるのが良いかもですが、 管理テーブルが増加してしまうので、 メンテナンス面でもあまり良く無いかと。 私の場合は、実装とDB設計を同時に行うことが多いので、実装よりではあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問