我正在进行在线调查。大多数问题的答案等级为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可能会访问的东西。
使用指定答案类型的列,但将答案存储为文本。您的应用程序或前端可以使用answer_type列确定向最终用户显示的内容(测试框,单选按钮,日期选择器)以及在将其发送回数据库之前如何对其进行验证。