Дизайн БД для хранения данных динамической формы с полями множественного выбора

Как хранить данные из динамической формы с полями с множественным выбором.

Я читал различные сообщения, и во всех примерах есть только ключ списка, ввод значения. Но если в форме есть множественный выбор. как лучше всего хранить данные. Я не ищу решение NoSQL.

текущий дизайн

 forms
-----
  id (PK)
  name     
  (other fields)

form_elements
-------------
  id (PK)
  form_id (FK to forms.id)
  element_type_id (FK to element_types.id)
  name
  list_group (nullable, it will be related only for multiselect inputs)      
  (other fields)

element_types
-------------
  id (PK)
  name

list_values
-------------------
  id (PK)      
  value
  group
  (other fields??)

Образец данных таблицы формы

| form_id |    form_name    |
|:-------:|:---------------:|
|    1    |   Enquiry Form  |
|    2    | Test Drive Form |
|    3    |  Feedback Form  |

Образец Form_elements

| id | form_id | element_type_id |    name   | list_group |
|:--:|:-------:|:---------------:|:---------:|:-------:|
|  1 |    1    |        1        | firstName |         |
|  2 |    1    |        1        |  LastName |         |
|  3 |    1    |        2        |   color   |    color|

element_types

| id    |   name    |
|:--:   |:--------: |
|  1    |   text    |
|  2    | checkbox  |
|  3    |   radio   |

list_values ​​пример данных

| id    | value     | group     |
|:--:   |:-----:    |-------    |
|  1    |  red      | color     |
|  2    |  blue     | color     |
|  3    | green     | color     |
| 4     | Dell      | brand     |
| 5     | HP        | brand     |

образец json опубликован

{
  "firstName": "john",
  "lastName": "Doe",
  "color": "red"
}

Таблица form_submit будет иметь следующие строки

| form_id   | Column_id     | value     |
|:-------:  |:---------:    |:-----:    |
|    1      |     1         |  John     |
|    1      |     2         |  Doe      |
|    1      |     3         |  Red      |
|    1      |     1         | James     |
|    1      |     2         | Smith     |
|    1      |     3         |  Blue     |

если динамическая форма имеет несколько вариантов выбора, образец json будет опубликован

{
  "firstName": "John",
  "lastName": "Doe",
  "color": [
    "red",
    "green",
    "blue"
  ]
}

как вы храните эти данные.
Нужно ли нам хранить их в той же таблице form_submit. или хранить в другой таблице


person Mukun    schedule 05.07.2017    source источник
comment
Для какой цели вы его храните? Это для загрузки в другую систему или для отчета по ней? Если это для отчета, то что это за отчеты? Вам нужен отчет с подсчетом всех людей, выбравших зеленый? Или это просто бумажная свалка того, что выбрали люди? Или у вас есть логика, которая проверяет ответы и выставляет оценки?   -  person Nick.McDermaid    schedule 06.07.2017
comment
Вы не описали какие-либо ограничения, которые помогли бы нам решить, можете ли вы просто заполнить JSON как есть или вам следует построить таблицу мостов, определяющую отношения «многие ко многим». Правильный нормализованный способ - построить таблицу мостов, но мы не знаем ваших ограничений.   -  person Nick.McDermaid    schedule 06.07.2017
comment
@ Nick.McDermaid нам нужно загрузить / связать необработанные данные с другой системой. Также мы хотели бы иметь отчеты, такие как количество выбранных цветов и т. Д. Мы используем ms sql server 2014. / Spring MVC. Я не хочу хранить в JSON. Я предпочитаю хранить в таблицах для сложных запросов. Итак, я ищу лучший дизайн БД для поддержки этого   -  person Mukun    schedule 06.07.2017
comment
Итак, что представляет собой form_submit? Не похоже, что он поддерживает ввод нескольких значений в форму. т.е. если один человек вводит один набор значений, а другой вводит другой набор, не похоже, что это поддерживается этой таблицей. Вам понадобится еще один столбец, например submit_id, который представляет материалы каждого человека. Подумай об этом, тогда я или кто-то другой смогу дать ответ   -  person Nick.McDermaid    schedule 06.07.2017
comment
Да, form_submit предназначен для хранения отправленных данных, и в настоящее время он не поддерживает несколько выбранных входов. Это будет работать, если у нас есть только список ключей, значений. поэтому мне нужна помощь в разработке таблиц БД для поддержки нескольких выбранных значений (массив выбранных цветов)   -  person Mukun    schedule 06.07.2017
comment
Я знаю, что он не поддерживает множественный выбор. Он также не поддерживает более одной записи формы. Когда следующий человек заполняет форму, она просто перезаписывает то, что там есть? Или вы ожидаете, что форма будет заполнена только один раз?   -  person Nick.McDermaid    schedule 06.07.2017
comment
Он поддерживает более одной записи в форме, я обновил таблицу. Для простоты я проигнорировал поля, такие как дата отправки, пользователь и т. Д.   -  person Mukun    schedule 06.07.2017
comment
Хорошо, я предполагаю, что в этой таблице есть столбец с именем submit_id. Который указывает группу вопросов и ответов в одной отправке.   -  person Nick.McDermaid    schedule 06.07.2017


Ответы (2)


Во-первых ... Я должен предупредить, что подобные динамические схемы обычно являются плохой идеей.

Во-вторых, похоже, что ваш form_submit может хранить только один набор ответов.

Я делаю здесь предположения - неясно, нужно ли вам поддерживать несколько наборов или нет, но это имело бы смысл, если бы это было так.

Итак, во-первых, давайте расширим form_submit для поддержки нескольких наборов вопросов от разных людей. Мы добавим столбец submit_id, который является экземпляром вопросника (набора вопросов), на который кто-то отвечает.

submit_id   form_id   Column_id   value
    1           1        1        Block
    1           1        2        Rough
    1           1        3        Red
    2           1        1        Cylinder
    2           1        2        Smooth
    2           1        3        Blue

Теперь мы знаем, что submit_id = 1 - это один набор вопросов, на который отвечает один человек, а submit_id = 2 - это еще один другой набор вопросов, на который отвечает другой.

Возможно, вы захотите создать заголовок отправки, который описывает это:

submit_id      form_id    submit_datetime          submit_by
    1             1        2017-07-06 09:37:00       Fred
    2             1        2017-07-02 07:31:00       Fred

Теперь мы можем создать таблицу, скажем multiselect, которая позволяет нам определять взаимосвязь между множеством возможных вопросов и множеством возможных множественных выборок.

submit_id   column_id   list_value_id
     1          3            1   (red)
     1          3            2   (blue)
     1          3            3   (green)
     2          3            4   (dell)

Этот набор строк говорит нам, что в вопроснике 1 был выполнен множественный выбор в столбце 3, и они выбрали красный, сине-зеленый.

Вопросник 2 содержал множественный выбор в столбце 3, и они просто выбрали Dell.

Для этого вам даже не нужна строка в вашей form_submit таблице. Смотря что еще хранит ваш form_submit.

Это всего лишь один из способов сделать это. Но на самом деле это продиктовано вашими бизнес-процессами, отношениями между объектами, тем, как вы хотите вводить и выводить данные и т. Д. Вы можете исследовать модели данных questionairre в Интернете, потому что в этом нет ничего нового.

Я подозреваю, что это может вызвать больше вопросов, но давайте сначала попробуем

person Nick.McDermaid    schedule 06.07.2017
comment
Я также подумал, что аналогично для DB Design One Table (form_submit) для хранения полей значений ключа, а другой (multiselect) для хранения полей с множественным выбором. Но я пытаюсь визуализировать объекты Java. и как я буду сохранять их и извлекать - person Mukun; 06.07.2017
comment
Что я не могу помочь с сожалением - person Nick.McDermaid; 07.07.2017

Решением может стать использование JsonString для сохранения отправленных форм:

form_submit
-------------
  id (PK)
  form_id
  user_id
  value_json
  (other_fields)

где value_json -> {"form_element_id в качестве ключа": "отправленное значение"}

позволяет сказать в определенной форме, что у нас есть поле имени (идентификатор поля 23) и множественный выбор (идентификатор поля 24) с параметрами [«a», «b», «c»].

Таким образом, образцы данных для таблицы form_submit могут быть

| form_id | u_id |                      value_json                       |    
|:-------:|:----:|:-----------------------------------------------------:|
|    1    | 049  | '{"23": "Some random question", "24": ["a", "b"]}'    |
|    1    | 033  | '{"23": "Another random question", "24": ["a"]}'      |
person Mudit Garg    schedule 06.08.2019