【问题标题】:DB Design for storing dynamic form data with multi select fields用于存储具有多选字段的动态表单数据的数据库设计
【发布时间】:2017-07-05 19:00:46
【问题描述】:

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

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

元素类型

| 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 表中。或存储在不同的表中

【问题讨论】:

  • 你存储它的目的是什么?是上传到另一个系统还是报告它?如果是报道,它们是什么类型的报道?你需要一份统计所有选择绿色的人的报告吗?或者它只是人们挑选的硬拷贝转储?还是你有逻辑来检查答案并分配分数?
  • 您没有描述任何约束来帮助我们决定是否可以按原样填充 JSON,或者是否应该构建一个定义多对多关系的桥接表。 “正确”的规范化方法是建立一个桥表,但我们不知道你的约束。
  • @Nick.McDermaid 我们需要将原始数据下载/连接到另一个系统。此外,我们希望获得报告,例如选择的颜色计数等。我们使用的是 ms sql server 2014 。 /弹簧MVC。我不想存储在 JSON 中。我更喜欢将复杂查询存储在表中。所以我正在寻找一个最好的数据库设计来支持这个
  • 那么form_submit代表什么?它看起来不支持任何人在表单中输入多个值。即,如果一个人输入一组值而另一个人输入另一组值,则该表似乎不支持这一点。您需要另一个 rcolumn,例如 submit_id,它代表每个人的提交。考虑一下,然后我或其他人可以提出答案
  • 是的 form_submit 是存储提交的数据,目前不支持多选输入。如果我们只有一个键值列表,它将起作用。所以我需要帮助设计一个数据库表来支持多个选定的值(选定颜色的数组)

标签: json database forms database-design dynamicform


【解决方案1】:

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

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

wherein value_json --> {"form_element_id as key" : "submitted value"}

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

【讨论】:

    【解决方案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 列上有一个多选,他们选择了红色、蓝绿色。

    Questionaire 2 在第 3 列有多项选择,他们选择了戴尔

    您甚至不需要在form_submit 表中为此设置一行。这取决于您的form_submit 还存储了什么。

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

    我怀疑这可能会引发更多问题,但让我们先尝试一下

    【讨论】:

    • 我也认为数据库设计一个表(form_submit)存储键值字段和另一个(多选)存储多选字段类似。但我正在尝试可视化 Java Entities 。以及我将如何持久保存它们并检索
    • 抱歉,我无能为力
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多