假设我们有一个调查,其中一些问题是跨多个实体提出的。
例如:
汽车品牌=[品牌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

B)表格:答案
QuestionId | AnswerValue
  Q01-1    |     7
  Q01-2    |     5
  Q01-3    |     4
  Q01-4    |     8

查询可以一次针对一个品牌,也可以针对所有品牌,两个查询的优先级相同。
选项A似乎给了我一些优势,如果我需要做一些像group by这样的事情,但是如果大多数查询是针对某个特定品牌的,那么选项B似乎更有效率。
思想?

最佳答案

选择A更好,即使你现在看不到。
不管你怎么看,在一个数据库“cell”中存储多个值都是一个错误(尽管不幸的是,这是一个非常常见的错误),更不用说它违反了first normal form的规定,即每一列只能在每一行中包含一个原子值(尽管最初的规则使用不同的术语)。
缺点很多,其中一些非常关键,包括(但不限于):
您失去了使用正确数据类型的能力—存储在一起的两个int必须存储为不同于int的数据类型。
您可能会失去验证数据是否正确的能力,或者不同部分可以转换为正确的数据类型(现在大多数数据库支持检查约束,但不是全部(是的,MySql,我指的是您!)
您失去了分别对数据的每个部分强制唯一性的能力。
不能将数据的不同部分用作外键约束的基础
这个列表一直在列-但我认为任何人现在都应该了解-数据库列应该用于存储每一行的单个值-每次。

关于sql - SQL-调查数据,用于循环调查问题的表架构设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54834274/

10-11 22:29
查看更多