我正在创建一个允许用户添加产品的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??)
这似乎对存储创建的表单方面有很大的意义,但我正在努力准确地存储这些表单的结果。
答案 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解析即可读取。缺点:可能很难搜索。
无论如何,这些只是想法,所以根据您的需要调整它们。