小编典典

用于调查的SQL设计,具有不同数据类型的答案

sql

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

我们被要求添加可以包含不同数据类型答案的调查问题。规范要求调查是“可配置的”,以便在将来的任何时候,当有人说:“我们需要一项新的调查,询问{文本答案问题},{1-5问题},{真假问题}
,{以日期作为答案的问题}”,我们可以在不更改数据库结构的情况下做到这一点。

我正在尝试寻找存储这些答案的最佳方法,但是我想出的每一种方法都显得有些拙劣。

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

一种简单的解决方案是将每个问题作为调查中的一列,将其答案作为调查中的一列,以及是否在调查中将其作为一列。在我看来,这真是一团糟-
那是一张大桌子;不是很“关系”。

集思广益,我能想到的“最佳”方法是为每种答案类型使用不同的表,但是容易受到数据完整性问题的影响。换句话说,我会

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中的任何问题,我不能保证至少存在一个答案。

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

因此,我发现上述想法存在问题。是否有解决此问题的“最佳”方法?

现在,我已经花了一些时间来表达问题和想法,看来我提出的主要问题是“我想在不进行任何编码的情况下存储任意类型的数据…”是这样吗?绝望?

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


阅读 180

收藏
2021-03-23

共1个答案

小编典典

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

2021-03-23