DB Design用于存储具有多选字段的动态表单数据

时间:2017-07-05 19:00:46

标签: json database forms database-design dynamicform

如何使用多选字段存储动态表单中的数据。

我已阅读各种帖子,所有示例都只有列表键,值输入。但是如果表单有多选输入。什么是存储数据的最佳方式。 我不是在寻找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表中。或存储在不同的表格中

2 个答案:

答案 0 :(得分:1)

使用JsonString保存您提交的表单可以解决:

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

其中value_json-> {“ form_element_id作为关键字”:“提交的值”}

以某种形式说,我们有一个名称字段(字段ID 23)和一个multiselect(字段ID 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"]}'      |

答案 1 :(得分:0)

首先......我必须警告,像这样的动态模式通常是一个坏主意。

其次,您的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列有一个多选,他们刚刚选择了戴尔

您甚至不需要在form_submit表中添加一行。这取决于你的form_submit商店还有什么。

这只是一种方法。但它实际上取决于您的业务流程,实体之间的关系,您希望如何获取数据等等。您可能希望在线研究问题数据模型,因为这不是什么新鲜事。

我怀疑这可能只是提示更多问题,但让我们先尝试一下

相关问题