在DBMS中存储动态表单数据,寻找最佳方法

时间:2009-12-01 18:18:52

标签: mysql database

在处理将存储大量(完全不同的)表单的项目时,我面临着如何在保持数据库可用的同时存储值的设计问题。

简要说明:每个“文档”包含可变数量的问题(尽管每种文档的数量一致)和匹配的答案。

我提出的最有用的方法如下,在这里我按“类型”对文档进行分组,它标识了哪些问题属于文档,而这些问题反过来又有匹配问题的答案。

  +---------------+ 1      n +-----------+
  | DocumentType  |----------| Questions |
  +---------------+ Has many +-----------+
         |1                      1|
         |n Is of type           n| Belongs to
  +---------------+ 1      n +-----------+
  | DocumentEntry |----------|  Answers  |
  +---------------+ Has many +-----------+

这里的缺点是,当数据库变大时,查询提取问题A和答案B的文档会变得相当复杂,而且很快就会出现这种问题。

我想知道我是否偶然发现了存储数据的最佳方法,或者是否有一些我可能错过的简洁解决方案。

1 个答案:

答案 0 :(得分:2)

你遇到了一个常见的问题:尝试使用静态的东西(具有预定义结构的数据库)来表示动态的东西(一堆个别数据集只有一个共同点:它们来自表单)。你想要的是 doable 与数据库,但是如果没有它会更容易,但是因为我认为你真的想要使用数据库,这就是我要做的事情:

  • 您有document(或问卷),其中包含多个questions。这两者都是通用的,需要自己的表,就像你到目前为止一样。
  • 每个问题都有一个type来定义它是什么类型的问题(多选,自由形式,选择一个...... )当然问题还有{{1} }。所以这是两张桌子。这里的理由是,将这些与实际问题分离,允许存在某种抽象级别,并且您的查询仍然有点简单,尽管可能是loooooong。

因此,每个文档都有1..n到问题,每个问题有1种类型和1..n选项。跳过一点,这是我正在考虑的链接表等。

options

这种设计允许以下几点:

  • 问题本身是可以重复使用的,非常方便,如果你正在制作一个通用的“从一组y问题中回答这些x随机问题”。
  • 可以轻松添加新类型而不会破坏现有类型。
  • 您可以随时轻松地浏览结构,例如“我有这个问题答案的文档名称是什么?”或“有多少人对此错误回答错误问题吗?“
  • 因为类型是分开的,所以您可以创建一个(Web)UI,它可以轻松地反映数据库中的状态 - 更好的是,如果类型发生变化,您甚至根本不需要触摸UI代码。
  • 由于问题的每个可能选项都是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,因此您需要能够解析很多内容,甚至可能需要为转换提示引入另一个字段。

希望这有帮助,即使你根本不同意我的解决方案。