Database 我应该如何设计问卷数据库?

Database 我应该如何设计问卷数据库?,database,database-design,Database,Database Design,我对创建数据库有点陌生,这是我所做过的最复杂的一个,我想确保我在设计中遵循了最佳实践。这只是一个私人项目,我正在做的学习作为乐趣 基本上,我将有调查问卷存储,可以有多个问题。如果已经创建了多个问卷,那么问题可以在多个问卷上重复使用,因此我有一个智能搜索界面,可以检查数据库 然后,我有一个与问卷上的一个问题相关联的每个问题的答案,以及一个在某个日期回答的用户 我也会有多个问题类型:选择,文本,文本,区域,数字,日期,收音机 对于select类型,我会有一个选项表,指示select可用的选项 当使用

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

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

然后,我有一个与问卷上的一个问题相关联的每个问题的答案,以及一个在某个日期回答的用户

我也会有多个问题类型:选择,文本,文本,区域,数字,日期,收音机

对于select类型,我会有一个选项表,指示select可用的选项

当使用调查问卷时,用户表将链接到答案

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

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


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

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

将调查问卷和问题作为文档处理,还可以为您提供一些更灵活的表示依赖性的工具:而不是将您吸烟与否联系起来?如果条件对象存在,您可以将验证器应用于该对象,并且仅在满足任何条件时才提问:

[..., {
  "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", ...]
}, ...]

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

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

将调查问卷和问题作为文档处理,还可以为您提供一些更灵活的表示依赖性的工具:而不是将您吸烟与否联系起来?如果条件对象存在,您可以将验证器应用于该对象,并且仅在满足任何条件时才提问:

[..., {
  "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中的层次关系/关联没有困难。表示或查询关系DBMS中的层次关系/关联没有困难。