调查数据库设计
最后更新:2015 年 5 月 3 日
图表和 SQL 文件现已在https://github.com/durrantm/survey提供
如果您使用此(顶部)答案或任何元素,请添加有关改进的反馈!!!
这是一部真正的经典,由成千上万人完成。他们总是看起来“相当简单”,但实际上它非常复杂。要在 Rails 中执行此操作,我将使用附图中显示的模型。我敢肯定,这对某些人来说似乎过于复杂,但是一旦你构建了其中的一些,多年来,你就会意识到大多数设计决策都是非常经典的模式,最好通过动态灵活的数据结构来解决一开始。
更多详情如下:
关键表的表详细信息
答案
答案表至关重要,因为它捕获了用户的实际响应。您会注意到 answer 链接到question_options,而不是questions。这是故意的。
输入类型
input_types是问题的类型。每个问题只能是 1 种类型,例如所有无线电拨号、所有文本字段等。当有(例如)5 个无线电拨号和 1 个“包括?”复选框时使用附加问题。选项或一些这样的组合。将用户视图中的两个问题标记为一个,但内部有两个问题,一个用于无线电拨号,一个用于复选框。在这种情况下,复选框将包含一组 1。
选项组
option_groups和option_choices可让您构建“通用”组。例如,在房地产应用程序中,可能会出现“房产有多旧?”的问题。答案可能在以下范围内:1-5 6-10 10-25 25-100 100+
然后,例如,如果有关于相邻财产年龄的问题,那么调查将希望“重用”上述范围,以便使用相同的 option_group 和 options。
units_of_measure
units_of_measure就像听起来一样。无论是英寸、杯子、像素、砖块还是其他任何东西,您都可以在这里定义一次。
仅供参考:虽然本质上是通用的,但可以在此基础上创建应用程序,并且此模式非常适合Ruby On Rails框架,其中每个表的主键都具有诸如“id”之类的约定。此外,这些关系都是简单的 one_to_many,不需要 many_to_many 或 has_many throughs。我可能会添加 has_many :throughs 和/或 :delegates ,以便在没有.multiple.chaining 的情况下轻松地从单个答案中获取survey_name 之类的内容。