私は調査構築システムを構築していますが、データを保存するための最善の方法がわかりません。私が見ることができる2つの選択肢は次のとおりです。
- シリアル化されたアレイを使用するには、または
- 各要素を関連するテーブルに個別の行として格納するには
たとえば、最初のものを使用すると、次のようなものをシリアル化された配列として格納します。
Array
(
[name] => Survey
[sections] => Array
(
[0] => Array
(
[name] => Introduction
[pages] => Array
(
[0] => Array
(
[text] => Please answer the following questions.
[questions] => Array
(
[0] => Array
(
[text] => Are you male or female?
[answers] => Array
(
[0] => Male
[1] => Female
)
)
)
)
)
)
)
)
私がこれに見る利点は次のとおりです。
- 一元化されており、
次のような単純なクエリを使用して、スクリプト内で簡単に編集できます。
UPDATE surveys SET data = '$serialized_array'
私がこれに見る主な欠点は次のとおりです。
- スクリプトの外部で編集することは困難です(たとえば、Navicatを使用する場合など)
また、データをシリアル化された配列として格納することは悪い習慣だと聞きました。私はこれが完全に文脈に依存していると思いますが(または私がこれを聞いた人は誰でも間違っています)。
2番目(関連するテーブルの個別の行として各要素を格納する)を使用すると、次のようなデータベース構造になります。
調査
id name
1 Survey
セクション
id name survey_id index
1 Introduction 1 0
ページ
id text section_id index
1 Please answer these questions. 1 0
質問
id text page_id index
1 Are you male or female? 1 0
答え
id text question_id index
1 Male 1 0
2 Female 1 1
私がこれに見る利点は次のとおりです。
- コンテンツのより良い分離があり、
- スクリプトの外部で編集する方が簡単です(たとえば、Navicatを使用する場合など)
私がこれに見る主な欠点は次のとおりです。
- スクリプト内で編集するのはより困難です(再順序付けされた要素または再構造化された回答を処理するための複雑なロジックを持つ多くのクエリ)
あなたへの私の質問はこれです:これらの2つの方法のどちらが(実際にどちらかであるとしても)手元のタスクにより適していますか?データをシリアル化された配列として格納することを好むのは、構築がはるかに簡単で、制御が簡単に思えるからです。関連するテーブルにデータを別々の行として格納することで...エレガンス...を見ることができますが。
関連性がある場合は、JavaScriptを使用して調査を作成する時点で、(具体的には)jQueryを使用してHTML要素を追加、削除、並べ替えてから、完成品をフォームで送信します($_POST
配列は例Iです)。上記で与えた)。