
はじめまして。
この度、ユーザからの入力をデータベースに保存する複数アンケートフォームを作成しようとしています。
その際、各アンケートフォームごとに入力項目名、入力タイプ好きな数だけ管理側から設定できる仕様です。
このような通常フィールド(列)となる部分の名称やデータタイプを自由に設定できるデータベース設計がうまくいきません。現場ではどのようにしてやられてるのでしょうか?
私が思いつく限りでは
----------------------
アンケートフォームテーブル
・アンケートフォーム番号(PK)
・アンケート名称
----------------------
項目雛型テーブル
・項目番号(PK)
・データタイプ
----------------------
項目実体
・アンケートフォーム番号(PK)
・項目番号(PK)
・項目名称
・表示状態
----------------------
上記のような構造にした場合、ユーザ毎のアンケートデータを保存するテーブル構造が思いつきません。
作成できる項目数の限度を30に決めて、予め30フィールド、テキスト型のようなものを用意しておくのも狭い利用範囲になる気がしますが・・・
アドバイスをお願いします。
No.2ベストアンサー
- 回答日時:
項目名などの情報の定義情報もDBに保存するということですね。
定義情報を保存するテーブルと、その定義に従って保存されるデータを保存するテーブルを作るのが常套手段です。
今回の場合は、アンケートフォームと項目の2階層あるため、私なら
----------------------
アンケートフォーム定義テーブル
・アンケートフォーム定義番号(PK)
・アンケートフォーム名称
----------------------
項目定義テーブル
・アンケートフォーム定義番号(PK)
・項目定義番号(PK)
・項目名称
・データタイプ
・表示状態
----------------------
アンケートフォームデータテーブル
・ユーザ番号(PK)
・アンケートフォーム定義番号(PK)
・登録日時
----------------------
項目データテーブル
・ユーザ番号(PK)
・アンケートフォーム定義番号(PK)
・項目定義番号(PK)
・入力値
という感じです。
ここで問題になるの入力値のデータ型ですが、
2通り考えられます。
1、文字列型で定義しておき、数値型や日付型の場合は文字列型に変換して登録する。
2、文字列型、数値型、日付型の3つの列を用意し、定義によって適宜登録する列を変更する。
読み出し(SELECT)の場合は上記の逆となります。どちらかというと1の方が楽だと思います。
この回答への補足
パーフェクトに回答いただきましてありがとうございます。納得しました。
2点補足で教えてください。
●このようなテーブル構造の際に、DBから抽出したユーザのアンケート(いくつかの項目をピックアップし)を一行一ユーザとしてテーブルの表で表示したい場合、SQL文としてはどのようなものが最適でしょうか?最終的にはプログラム側では一ユーザのアンケートを一配列に納めた形で取り出したいのですが。。。
●このような構造にした場合、レコード数が
アンケート数 X 項目数 となり例えば10万件の回答がありそのアンケートフォームが30項目ある場合は、300万レコードとなりますが、期間限定ではない仕様の場合に運用上、オラクルのようなしっかりしたDBではないと耐えうるものにはならないのでしょうか?(フリーのMYSQL等では無理がありますでしょうか?)
宜しくお願いします
No.1
- 回答日時:
XMLデータベース(参照URL)
SQL Server2000やOracle8i以上(9iからかな?)なら、XMLデータ形式
参考URL:http://www.atmarkit.co.jp/fxml/tanpatsu/28xmldbc …
ありがとうございます。
RDMSのみで考えようとしなければ様々な方法があるものですね。
多次元データベースを含めいろいろ試していきたいと思います。
ためになりました。
またの機会にアドバイアスお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
エクセルグラフの凡例スペース
-
Access テキスト型に対する指定...
-
ORACLEでLONG項目からCHAR項目...
-
セルの右クリックで出る項目を...
-
Oracle 2つのDate型の値の差を...
-
SUBSTRING 関数に渡した長さの...
-
必須入力項目と入力必須項目
-
access2000:フォームで入力し...
-
Access又はExcelで256項目を超...
-
Accessで数値型にNULLをInsert...
-
VBAで複数の数式セルを最終行ま...
-
SQL*Loaderでのゼロ埋め
-
datファイルからaccessにインポ...
-
Accessのハイパーリンク...
-
ピボットテーブルでフィルター...
-
データベースのフィールドその...
-
指定した項目の列削除
-
SELECT DISTINCT...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
エクセルグラフの凡例スペース
-
Access テキスト型に対する指定...
-
セルの右クリックで出る項目を...
-
SUBSTRING 関数に渡した長さの...
-
必須入力項目と入力必須項目
-
BIOSでAHCIに設定したいが、項...
-
Accessレポートで特定条件で改...
-
他テーブルで一致する列から名...
-
Accessで数値型にNULLをInsert...
-
ORACLEでLONG項目からCHAR項目...
-
datファイルからaccessにインポ...
-
access2000:フォームで入力し...
-
指定した項目の列削除
-
APN設定について教えていただけ...
-
VBAで複数の数式セルを最終行ま...
-
条件に一致した列の非表示の仕...
-
複数のレコードを1つのレコード...
おすすめ情報