5

我正在进行一项在线调查。大多数问题的答案范围为 1-5。如果我们需要在调查中添加问题,我会使用一个简单的 Web 表单,它会在相应的表格中插入一个 INSERT,瞧!调查提出了新问题——没有新代码或对数据库结构进行更改。

我们被要求添加可以有不同数据类型答案的调查问题。规范是让调查“可配置”,以便在未来的任何时候,当有人说:“我们需要一个新的调查来询问 {text answer question}, {1-5 question}, {true false question} , {question with a date as an answer}”,我们可以在不改变数据库结构的情况下做到这一点。

我试图想出存储这些答案的最佳方法,但我想出的每一种方法似乎都有些骇人听闻。

有些问题可能有一个是/否或真/假的答案,有些可能有一个整数答案(“过去一个月你使用过技术支持多少次?”),另一个答案可能有一个日期、一个字符串、一个倍数具有单个值的选择,具有多个值的多项选择等。或者有时,特定的答案值可能会提示一个子问题(“什么让您失望......?”)

简单的解决方案是将每个问题作为调查中的一列,将其答案作为调查中的一列,以及是否将其作为调查中的一列。这对我来说就像一团糟——这是一张大桌子;不是很“关系”。

头脑风暴,我能想出的“最佳”方法是为每种答案类型设置不同的表格,但这容易受到数据完整性问题的影响。换句话说,我会

CREATE TABLE `Questions` (...);
CREATE TABLE `TrueFalseAnswers` (...);
ALTER TABLE `TrueFalseAnswers`
  ADD CONSTRAINT `TrueFalseAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE `TextAnswers` (...);
ALTER TABLE `TextAnswers`
  ADD CONSTRAINT `TextAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

等等

上述问题的一个问题是,我不能保证仅在 DDL 中的任何问题都存在至少一个且只有一个答案。

另一种解决方案可能是在 Questions 表中为答案设置一个二进制或字符串列,并将所有答案编码为某种字符串或二进制格式,并将它们存储在答案列中。这为每个问题提供了至少一个且只有一个答案,但随后我无法访问 SQL 查询中的聚合功能。这让我觉得这不是一个非常“相关”的解决方案。

因此,我发现上述想法存在问题。有没有“最好”的方法来解决这个问题?

既然我已经花时间表达了这个问题和我的想法,我提出的广泛问题似乎是“我想在不进行任何编码的情况下存储任意类型的数据......”这是绝望?

我正在使用 MySQL,所以我无法访问其他 RDBMS 可能的东西。

4

4 回答 4

7

使用指定答案类型的列,但将答案存储为文本。您的应用程序或前端可以使用 answer_type 列来确定向最终用户显示的内容(测试框、单选按钮、日期选择器)以及如何在将其发送回数据库之前对其进行验证。

于 2009-11-19T16:16:57.647 回答
2

您想要创建一个与 QuestionType 类对应的 QuestionType 表。允许用户填写的持久答案是自由格式的文本,并将其留给 QuestionType 来确定答案的含义。

所以 - 如果它是真/假,答案可能是“T”或“F”。

如果是多项选择,则答案可能是所选选项的索引。

如果是用户填写的文本框,请保存他们输入的文本。

于 2009-11-19T16:16:04.950 回答
2

我摆出的姿势是“我想存储任意类型的数据而不进行任何编码......”这是没有希望的吗?

是的,它几乎是。您提出的问题没有“好的”解决方案。“最好的”是 Dave Swersky 和 ​​Larry Lustig 所描述的:

一个问题表,其中存储问题、可能的答案(如果是多项选择)和问题类型

一个答案表,它存储问题的答案(FK 到 Question 表),序列化为文本。Varchar(4000) 或 TEXT 数据类型,除非绝对必要,否则最好是前者。

由您的应用程序逻辑根据为问题指定的类型确定值的含义。

于 2009-11-19T16:22:48.400 回答
0

您还可以使用 dataType 指定的表,例如整数、日期、字符串等的表。从那里,1 个答案表,将问题(表)链接到正确的 dataType 表 + 主键。

要对所有带有答案的问题进行概览,您可以在此之上创建一个视图,只需将所有数据类型转换为视图中的文本。

于 2014-06-11T07:45:13.490 回答