首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -调查数据,环形调查问题的表模式设计

SQL -调查数据,环形调查问题的表模式设计
EN

Stack Overflow用户
提问于 2019-02-22 19:57:27
回答 2查看 229关注 0票数 0

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

例如:

汽车品牌=品牌1,品牌2,品牌3,品牌4

这个问题将被问到每个汽车品牌(环)。

问题Q01 =(表1-10)你认为汽车品牌车是可靠的吗?

问题Q02 =(表1-10)你认为汽车品牌车是一个好的价值吗?

..。

我正在设计一个模式,它将为一些基于web的分析工具提供动力,因此查询性能非常重要。

模式将有三个表:记录、问题、答案。

对于答案表,我有两种方法:

( A)表:答案

代码语言:javascript
复制
QuestionId | AnswerValue | BrandOption 
   Q01     |      7      |      1
   Q01     |      5      |      2
   Q01     |      4      |      3
   Q01     |      8      |      4

( B)表:答案

代码语言:javascript
复制
QuestionId | AnswerValue
  Q01-1    |     7
  Q01-2    |     5
  Q01-3    |     4
  Q01-4    |     8

查询可以一次针对一个品牌,也可以针对所有品牌,这两个查询具有同等的优先级。

选项A似乎给了我一些优势,如果我需要做一些类似于一个组的事情,但是如果大多数查询都是针对某个特定品牌的,那么选项B似乎更有效率。

有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-22 20:12:09

选项A更好,即使你现在没有看到它。

在单个数据库“单元格”中存储多个值是一个错误(尽管不幸的是,这是一个非常常见的错误)--更不用说它违反了第一范式 --后者明确规定,每一列只能在每一行中包含一个原子值(尽管最初的规则使用了不同的术语)。

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

  • 您失去了使用正确数据类型的能力--与int不同的数据类型必须存储在一起存储的两个int。
  • 您可能失去了验证数据是否正确的能力,或者可以将不同的部分转换为正确的数据类型(现在大多数数据库都支持检查约束,但并不支持所有约束(是的,MySql,我把我的手指指向您!)
  • 您失去了单独对数据的每个部分强制执行唯一性的能力。
  • 不能将数据的不同部分用作外键约束的基础

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

票数 2
EN

Stack Overflow用户

发布于 2019-02-22 20:12:59

在我看来,第一个版本更可取。它使得为单个品牌寻找不同问题的答案和跨品牌寻找相同问题的答案变得更加容易。

回答这个问题似乎是个拙劣的替代品。首先,它排除了与questions表和brands表的简单外键关系。我非常喜欢明确的外键关系。

当然,要做到这一点,您将需要一种方法来存储“没有品牌”或“品牌无关”。一种方法是使用NULL来回答这些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54834274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档