用于存储具有多个 select 字段的动态表单数据的数据库设计

DB Design for storing dynamic form data with multi select fields

如何从具有多个 select 字段的动态表单中存储数据。

我已经阅读了各种 post 并且所有示例都只有列表键、值输入。但是如果表单有多个 select 输入。存储数据的最佳方式是什么。 我不是在寻找 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??)

表单Table示例数据

| 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 posted

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

form_submit table 将有以下行

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

如果动态表单有多个 select 选项 示例 json posted 将是

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

你如何存储这些数据。
我们需要将它存储在相同的 form_submit table 中吗?或存储在不同的 table

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

其次,您的 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 是另一个人回答的另一组不同的问题

您可能想要创建一个描述此内容的提交 header:

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

现在我们可以创建一个 table,比如说 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 table 中添加一行。这取决于您的 form_submit 商店。

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

我怀疑这可能会提示更多问题,但让我们先试试这个

使用 JsonString 保存您提交的表单可能是一个解决方案:

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

其中 value_json --> {"form_element_id as the key" : "submitted value"}

让我们以某种形式说,我们有一个名称字段(字段 ID 23)和一个多选字段(字段 ID 24),其中 ["a"、"b"、"c"]作为选项。

所以 form_submit Table 的示例数据可以是

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