包含许多选项的数据库设计表单

时间:2017-09-28 00:43:28

标签: mysql database database-design

我正在创建一个允许用户添加产品的Web应用程序;但是,对于每种产品,可能会有以下10到20个问题:

Is the product good for:
[ ] children [ ] teenagers [ ] adults [ ] seniors
Categories that apply:
[ ] fun [ ] puzzle [ ] technical [ ] necessity [ ] fashion [ ] other: _____
Is product unique? [ ]
if yes explain how _______________

用户还可能会添加更多问题。存储此类数据的最佳方式是什么,包括问题和响应。主要的好处是,在许多情况下可以检查多个盒子,并且可以添加更多问题。

最初我的计划是为每个可能的复选框设置一个products表,其中有可空的布尔值。如果没有动态添加问题,它在技术上会起作用,但表格大小变得非常大,我不是特别喜欢,但也不确定是出于技术原因的问题。

我想过类似的事情:

forms
-----
  id (PK)
  name
  owner_id (FK to users.id)
  (other fields)

form_elements
-------------
  id (PK)
  form_id (FK to forms.id)
  element_type_id (FK to element_types.id)
  caption
  (other fields)

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

element_list_values
-------------------
  id (PK)
  element_id (FK to form_elements.id)
  name
  value
  (other fields??)

这似乎对存储创建的表单方面有很大的意义,但我正在努力准确地存储这些表单的结果。

1 个答案:

答案 0 :(得分:2)

我最初考虑两种策略,传统的关系数据库方法和JSON方法。

传统方法

由于每个产品只需要设置1个答案,因此您可以将值存储在定义答案项目的同一个表格中(我认为您的设计中为element_list_values)。这是一个想法:

forms
-----
form_id             int  PK
product_id          int FK to product table

questions
---------
question_id         int PK
form_id             int FK to forms table
question_text       varchar

answers
-------
answer_id           int PK
question_id
answer_field_type   enum('textbox', 'checkbox')
answer_text         varchar
answer_value        varchar /* store answers here */

表格数据的样本如下:

forms
-----
form_id     product_id
1           1

questions
---------
question_id form_id question_text
1           1       Is the product good for
2           1       Categories that apply

answers
-------
answer_id   question_id field_type  answer_item answer_value
1           1           checkbox    Children
2           1           checkbox    Teenagers   true
3           1           text        Others      Infants

优点:完全关系,可搜索 缺点:有点复杂

JSON方法

此方法将整个表单存储在1个字段中作为JSON对象(如果您对此更熟,则为XML,或者是序列化对象)。这是一个想法:

forms
-----
form_id             int  PK
product_id          int FK to product table
questions           text (or json if your db has it)

表单将存储在questions列中,其答案如下:

{
    "questions": [
        {
            "question": "Is the product good for:"
            "answers": [
                {
                    "item": "Children",
                    "type": "checkbox",
                    "value": ""             
                },
                {
                    "item": "Teenagers",
                    "type": "checkbox",
                    "value": "true"                             
                },
                {
                    "item": "Others",
                    "type": "text",
                    "value": "Infants"                              
                },
            ]
        }
    ]
}

如果您需要可搜索的答案,可以将答案/标签存储在您可以查询的另一个表格上。

优点:设计更简单,更灵活,易于实现 - 只需JSON序列化要存储的对象和JSON解析即可读取。缺点:可能很难搜索。

无论如何,这些只是想法,所以根据您的需要调整它们。