4

ソフトウェアで、Web インターフェイスを介してユーザーが設計したフォームを作成できるようにする必要があります。つまり、質問、タイプ (テキスト、ラジオ、チェックボックスなど)、必要に応じてオプション (ラジオ/チェック) を作成し、追加して、フォーム内のすべてのフィールドを作成するまでこのプロセスを続けます。

表示/入力/印刷以外にクエリは実行されません。つまり、無制限に入力できる「アンケート」が追加されます (20 回、数百万回の場合もあります)。

いくつかの調査の後、EAV タイプのソリューションは良さそうに思えましたが、それについては否定的な見方がたくさんあります。多くの人が、この種の状況で NoSQL データベースを使用することを提案していますが、私には利点がまったくわかりません。多くのフィールドを含むフォームがあり、その後、多くのフィールドを含む結果が得られます。

一部のフィールド (text/text_area/date) には 1 つの可能な値がありますが、多くのフィールドには複数のオプション (ラジオ ボタン、ドロップダウンの選択、チェック ボックス) があります。

従来の SQL でのサンプル設計を次に示します。

フォーム: Creator_id、名前

form_field: form_id、order、question、type (テキスト、text_area、date、radio、select、check)

form_field_option: form_field_id, name, value, order (これはラジオ/選択/チェックに使用されます)

form_result: form_id, application_id (私が使用する名前ではありませんが、すべての結果は「アプリケーション」に属します)

form_field_value: form_result_id, form_field_id, form_field_option_id, value (オプションのフィールドの値が空白の場合、テキストのフィールド form_field_option_id は空白になります)

これに基づいてフォームを作成し、結果を取得するのはかなり簡単に思えます。正確に効率的である場合とそうでない場合がありますが、典型的な形式は 5 ~ 30 の質問です。

これを NoSQL データベース、つまり Mongo などに配置する利点はありますか? もしそうなら、それらが何であるかの具体例とサンプルデザインを教えてもらえますか? 「これには NoSQL の方が適している」などの回答をたくさん見てきましたが、この分野での経験はありません。結果の取得が速いためですか、それとも何ですか? また、NoSQL を使用するとどのような欠点が生じるのでしょうか?

ありがとう

4

1 に答える 1

9

このアプリには、リレーショナル データベースよりも MongoDB の方が適していると思われます。基本的なエンティティであるフォーム デザインとフォームの結果は、事実上、コンテンツが本質的に結合されたドキュメントです。つまり、フォーム フィールドは、その親フォームのコンテキストの外ではほとんど意味がありません。

MongoDB を使用すると、リレーショナル データ モデルのようにさまざまなテーブルに分散するのではなく、これらのドキュメントをそれぞれ 1 つの構造として格納できます。

JSON よりも書きやすいという理由だけで、これは YAML です。基礎となる構造は同じです。

_id: 12345
creator: Adrian
name: NoSQL form demonstrator

fields:
  - id: first_name
    label: First name
    type: text
    required: true

  - id: last_name
    label: Last name
    type: text
    required: true

  - id: dob
    label: Date of birth
    type: date

  - id: bio
    label: Biography
    type: textarea

  - id: drink
    label: What would you like to drink?
    type: select
    options:
      - id: tea
        label: Tea
      - id: coffee
        label: Coffee
      - id: beer
        label: Beer
      - id: water
        label: Mineral water

    - id: mailing_list
      label: Join our mailing list?
      type: check
      default: false

ノート:

リレーショナル データベースの場合のように、すべてのコンテキストですべてのものの列を用意するのではなく、必要な場所にキーを格納するだけで済みます。たとえば、必要はありませんrequired: false-- それがデフォルトの場合はそのままにしておきます。

MongoDB ドキュメントには固有の順序があるため、フォーム デザイン内でフィールドの順序を保持するためにフィールドを作成する必要はありません。

フォームの結果も同じ方法で保存されます。あなたが期待するように、それらを自然に保存してください:

_id: 545245
form_id: 12345
name: NoSQL form demonstrator

results:
  - id: first_name
    label: First name
    type: text
    value: Adrian

  - id: last_name
    label: Last name
    type: text
    value: Short

  - id: dob
    label: Date of birth
    type: date
    value: 1970-01-01

  - id: bio
    label: Biography
    type: textarea
    value: Doing things on the internet

  - id: drink
    label: What would you like to drink?
    type: select
    value: Tea

  - id: mailing_list
    label: Join our mailing list?
    type: check
    value: false
于 2012-07-04T00:33:16.373 に答える