我正在开展一项在线调查。大多数问题的答案等级为 1-5。如果我们需要向调查添加问题,我会使用一个简单的 Web 表单,该表单会插入到相应的表中,瞧!调查提出了新问题——没有新代码或对数据库结构进行更改。
我们被要求添加可以有不同数据类型答案的调查问题。规范是让调查“可配置”,以便在将来的任何时候,当有人说“我们需要一项新的调查来询问{文本答案问题}、{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;
etc.
上述问题的一个问题是,我无法保证对于 DDL 中的任何问题至少存在一个且只有一个答案。
另一种解决方案可能是在问题表中为答案设置一个二进制或字符串列,并将所有答案编码为某种字符串或二进制格式,并将它们存储在答案列中。这为我的每一个问题提供了至少一个且仅有一个答案,但随后我就无法访问 SQL 查询中的聚合功能。我觉得这不是一个非常“相关”的解决方案。
因此,我认为上述想法存在问题。有没有“最好”的方法来解决这个问题?
现在我已经花时间来表达问题和我的想法了,看来我提出的广泛问题是“我想存储任意类型的数据而不进行任何编码......”是这样的吗?绝望?
我正在使用 MySQL,因此我无法访问其他 RDBMS 可能访问的内容。