PostgreSQL-调查数据,用于循环调查问题的表架构设计



假设我们进行了一项调查,其中一些问题在多个实体之间提出。

例如:
汽车品牌= [品牌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似乎会给我一些优势,如果我需要做类似团体之类的事情,但是,如果大多数查询是针对特定品牌的,那么选项B似乎更有效。

想法?

选项A更好,即使您现在看不到它。
在单个数据库"单元格"中存储多个值是一个错误,您以任何方式看(尽管不幸的是,这是一个非常常见的错误) - 更不用说这是对第一种正常形式的违反 - 特别指出,每列只能包含每一行中的一个原子值(尽管原始规则是使用不同的术语)。

缺点很多,其中一些是至关重要的,包括(但不限于):

  • 您会失去使用适当数据类型的能力 - 必须将两个ints存储在一起的两个INT必须作为与int。
  • 不同的数据类型存储
  • 您可能会失去验证数据的能力,实际上是正确的,或者可以将不同的部分转换为正确的数据类型(大多数数据库都支持当今的检查约束,但不是全部(是的,MySQL,我是将我的手指指向你!))
  • 您将分别在数据的每个部分上执行唯一性的能力。
  • 您不能将数据的不同部分用作外键约束的基础

列表还在继续 - 但是我认为现在任何人都应该得到图片 - 应该使用数据库列来存储每行的一个值 - 每次。

我认为第一个版本是可取的。它使一个品牌的不同问题的答案和跨品牌的同一问题更容易。

弹出问题ID似乎是一个不好的替代品。一方面,它排除了简单的外键关系到questions表和brands表。我是明确的外国密钥关系的忠实拥护者。

当然,要完成这项工作,您将需要一种存储"无品牌"或"不相关的品牌"的方法。一种方法是将NULL用于此类答案。

最新更新