在处理将存储大量(完全不同的)表单的项目时,我面临着如何在保持数据库可用的同时存储值的设计问题。
简要说明:每个“文档”包含可变数量的问题(尽管每种文档的数量一致)和匹配的答案。
我提出的最有用的方法如下,在这里我按“类型”对文档进行分组,它标识了哪些问题属于文档,而这些问题反过来又有匹配问题的答案。
+---------------+ 1 n +-----------+
| DocumentType |----------| Questions |
+---------------+ Has many +-----------+
|1 1|
|n Is of type n| Belongs to
+---------------+ 1 n +-----------+
| DocumentEntry |----------| Answers |
+---------------+ Has many +-----------+
这里的缺点是,当数据库变大时,查询提取问题A和答案B的文档会变得相当复杂,而且很快就会出现这种问题。
我想知道我是否偶然发现了存储数据的最佳方法,或者是否有一些我可能错过的简洁解决方案。
答案 0 :(得分:2)
你遇到了一个常见的问题:尝试使用静态的东西(具有预定义结构的数据库)来表示动态的东西(一堆个别数据集只有一个共同点:它们来自表单)。你想要的是 doable 与数据库,但是如果没有它会更容易,但是因为我认为你真的想要使用数据库,这就是我要做的事情:
document
(或问卷),其中包含多个questions
。这两者都是通用的,需要自己的表,就像你到目前为止一样。type
来定义它是什么类型的问题(多选,自由形式,选择一个...... )当然问题还有{{1} }。所以这是两张桌子。这里的理由是,将这些与实际问题分离,允许存在某种抽象级别,并且您的查询仍然有点简单,尽管可能是loooooong。因此,每个文档都有1..n到问题,每个问题有1种类型和1..n选项。跳过一点,这是我正在考虑的链接表等。
options
这种设计允许以下几点:
Document
bigint id
DocumentQuestions
bigint document_id
bigint question_id
Question
bigint id
varchar question
QuestionType
bigint question_id
bigint type_id
Type [pre-filled table with id:type pairs, such as 1=freeform, 2=select one etc.]
QuestionOptions
bigint id
bigint question_id
varchar description
varchar value
Answers
bigint id
bigint document_id
[etc. such as user_id]
QuestionAnswers
bigint answer_id
bigint question_id
bigint questionoptions_id
表中自己的行,因此您可以非常轻松地获得实际值。这个问题的一个明显问题是它需要在表之间进行非常严格的耦合以确保完整性,并且在开始时正确运行将是一件痛苦的事。此外,由于QuestionOptions
中的value
是varchar,因此您需要能够解析很多内容,甚至可能需要为转换提示引入另一个字段。
希望这有帮助,即使你根本不同意我的解决方案。