【问题标题】:how should I design a questionnaire database?我应该如何设计一个问卷数据库?
【发布时间】:2019-03-16 23:31:03
【问题描述】:

我对创建数据库有点陌生,这是我尚未创建的最复杂的数据库,我想确保在我的设计中遵循最佳实践。 (这只是我正在做的一个私人项目,学习是为了好玩)

基本上我会存储可以有多个问题的问卷。如果已经创建了问题,可以在多个问卷中重复使用,因此我有一个智能搜索类型的界面来检查数据库。

然后,我会为与问卷中的一个问题以及在某个日期回答该问题的用户相关联的每个问题提供一个答案。

我还会有多种问题类型:select、text、text_area、number、date、radio。

对于选择类型,我将有一个选择表,指示选择可用的选择。

在使用问卷时,用户表将链接到答案。

当一个问题依赖于另一个问题时,我也会有问卷依赖关系,比如:你吸烟吗?如果是 -> 你抽多少烟?

我不太确定的是多对多关系使用联结表和自引用联结表中的问题以形成依赖关系。 这会被认为是正确的设计吗?如果不是,我做错了什么?

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    在关系模式中,您可以通过自连接外键来表示问题依赖关系;您无需返回联结表,因为这两个问题之间的关系独立于每个问题与问卷的关系。

    但是,您可能已经注意到,在关系模式中表示一组分支问题不仅有点尴尬。如果问卷是您存储的大部分内容,您可能需要研究 MongoDB(或使用 Postgres 中的 JSONB 字段)之类的替代方案,它可以让您将问卷表示为包含嵌套问题的文档。单个用户对问卷的回答包括第二个(类型)文档;所有收集的问卷结果都可以通过用户或问卷轻松搜索,您可以使用聚合工具对单个问题的回答进行切片和挖掘。它没有唯一让问题重用变得更容易的事情 - 但可能性并不那么重要。

    将问卷和问题视为文档还为您提供了一些更灵活的工具来表示依赖关系:而不是“你吸烟吗?”之间的硬链接。和“多少?”,您可以将验证器应用于conditions 对象(如果存在),并且仅在满足任何条件时才提出问题:

    [..., {
      "name": "smoker",
      "text": "Do you smoke?",
      "values": [true, false]
    }, {
      "name": "how-much",
      "text": "How much do you smoke?",
      "conditions": {
        "smoker": true
      },
      "values": ["Socially", "< 1 pack/day", "1 pack/day", "2 packs/day", ...]
    }, ...]
    

    【讨论】:

    • “有点尴尬” 在关系 DBMS 中表示或查询层次关系(船舶)/关联并不困难。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2011-10-07
    • 2017-10-04
    • 2013-10-06
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多