SQL-调查数据,循环调查问题的表模式设计
假设我们有一个调查,其中一些问题是跨多个实体提出的 例如:SQL-调查数据,循环调查问题的表模式设计,sql,postgresql,database-design,Sql,Postgresql,Database Design,假设我们有一个调查,其中一些问题是跨多个实体提出的 例如: 汽车品牌=[品牌1、品牌2、品牌3、品牌4…] 将针对每个汽车品牌提出这些问题(循环)。 问题Q01=(量表1-10)你认为[汽车品牌]汽车可靠吗? 问题Q02=(量表1-10)你认为[汽车品牌]汽车价值高吗? 我正在设计一个模式,它将支持一些基于web的分析工具,因此查询性能非常重要 该模式将有3个表:记录、问题和答案 对于答案表,我有两种方法: A) 表:答案 QuestionId | AnswerValue | Brand
汽车品牌=[品牌1、品牌2、品牌3、品牌4…]
将针对每个汽车品牌提出这些问题(循环)。
问题Q01=(量表1-10)你认为[汽车品牌]汽车可靠吗?
问题Q02=(量表1-10)你认为[汽车品牌]汽车价值高吗?
我正在设计一个模式,它将支持一些基于web的分析工具,因此查询性能非常重要 该模式将有3个表:记录、问题和答案 对于答案表,我有两种方法: A) 表:答案
QuestionId | AnswerValue | BrandOption
Q01 | 7 | 1
Q01 | 5 | 2
Q01 | 4 | 3
Q01 | 8 | 4
QuestionId | AnswerValue
Q01-1 | 7
Q01-2 | 5
Q01-3 | 4
Q01-4 | 8
B) 表:答案
QuestionId | AnswerValue | BrandOption
Q01 | 7 | 1
Q01 | 5 | 2
Q01 | 4 | 3
Q01 | 8 | 4
QuestionId | AnswerValue
Q01-1 | 7
Q01-2 | 5
Q01-3 | 4
Q01-4 | 8
查询可以一次针对一个品牌,也可以针对所有品牌,两个查询的优先级相同
如果我需要做一些类似分组的事情,选项A似乎给了我一些优势,但是如果大多数查询是针对特定品牌的,那么选项B似乎更有效
想法?选项A更好,即使你现在看不到它。
在单个数据库“单元格”中存储多个值是一个错误(尽管不幸的是,这是一个非常常见的错误)——更不用说它违反了——其中明确规定,每列每行只能包含一个原子值(尽管原始规则使用了不同的术语) 缺点很多,其中一些很关键,包括(但不限于):
- 您失去了使用正确数据类型的能力-存储在一起的两个int必须存储为与int不同的数据类型
- 您可能无法验证数据是否正确,或者不同部分是否可以转换为正确的数据类型(现在大多数数据库都支持检查约束,但不是全部(是的,MySql,我指的是您!))
- 您失去了对数据的每个部分分别强制唯一性的能力
- 不能将数据的不同部分用作外键约束的基础
这个列表一直在列,但我认为现在任何人都应该了解了——每次都应该使用一个数据库列为每行存储一个值。选项a更好,即使您现在没有看到它。
在单个数据库“单元格”中存储多个值是一个错误(尽管不幸的是,这是一个非常常见的错误)——更不用说它违反了——其中明确规定,每列每行只能包含一个原子值(尽管原始规则使用了不同的术语) 缺点很多,其中一些很关键,包括(但不限于):
- 您失去了使用正确数据类型的能力-存储在一起的两个int必须存储为与int不同的数据类型
- 您可能无法验证数据是否正确,或者不同部分是否可以转换为正确的数据类型(现在大多数数据库都支持检查约束,但不是全部(是的,MySql,我指的是您!))
- 您失去了对数据的每个部分分别强制唯一性的能力
- 不能将数据的不同部分用作外键约束的基础
这个列表层出不穷——但我认为现在任何人都应该明白了——每次都应该使用一个数据库列为每行存储一个值。我认为第一个版本更可取。这使得寻找单个品牌的不同问题和跨品牌的相同问题的答案变得更加容易 口吃问题id似乎是一个糟糕的替代品。首先,它排除了与
问题
表和品牌
表的简单外键关系。我非常喜欢明确的外键关系
当然,要实现这一点,您需要一种方法来存储“无品牌”或“品牌不相关”。一种方法是使用
NULL
来回答这些问题。我认为第一个版本更可取。这使得寻找单个品牌的不同问题和跨品牌的相同问题的答案变得更加容易
口吃问题id似乎是一个糟糕的替代品。首先,它排除了与问题
表和品牌
表的简单外键关系。我非常喜欢明确的外键关系
当然,要实现这一点,您需要一种方法来存储“无品牌”或“品牌不相关”。一种方法是对这些答案使用
NULL
。选项A允许使用给定的问题ID查询所有答案,而不必去掉一些“-”;您可能希望对给定问题进行汇总,而不是对组合进行汇总(即所有品牌的赞成票和反对票数量)。什么使选项B更有效?如果索引为on(brandoption,questionid),您仍然可以非常高效。选项A允许使用给定的questionid查询所有答案,而不必去掉一些“-”;您可能希望对给定问题进行汇总,而不是对组合进行汇总(即所有品牌的赞成票和反对票数量)。什么使选项B更有效?在(brandoption,questionid)上有一个索引,您仍然可以非常高效。我要提到的是,在一个字段中存储多个值也打破了正常形式。强有力的回答。是的,我明白了,谢谢你的回答。但是,我们的想法不是在问题列上存储两个值,而是将问题id重命名,并将其视为品牌之间唯一的不同问题,我们的想法是在查询特定品牌时避免使用where子句,但我同意,选项A似乎更有意义如果您想要一个单列行ide,您可以始终添加代理键