我正在进行一项在线调查。大多数问题的答案范围为 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 可能的东西。