假设我们进行了一项调查,其中一些问题是跨多个实体提出的。
例如:
汽车品牌=品牌1,品牌2,品牌3,品牌4
这个问题将被问到每个汽车品牌(环)。
问题Q01 =(表1-10)你认为汽车品牌车是可靠的吗?
问题Q02 =(表1-10)你认为汽车品牌车是一个好的价值吗?
..。
我正在设计一个模式,它将为一些基于web的分析工具提供动力,因此查询性能非常重要。
模式将有三个表:记录、问题、答案。
对于答案表,我有两种方法:
( 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似乎更有效率。
有什么想法?
发布于 2019-02-22 20:12:09
选项A更好,即使你现在没有看到它。
在单个数据库“单元格”中存储多个值是一个错误(尽管不幸的是,这是一个非常常见的错误)--更不用说它违反了第一范式 --后者明确规定,每一列只能在每一行中包含一个原子值(尽管最初的规则使用了不同的术语)。
缺点很多,其中一些是至关重要的,包括(但不限于):
这个列表还在继续--但我认为现在任何人都应该知道--每次都应该使用一个数据库列来存储每一行的一个值。
发布于 2019-02-22 20:12:59
在我看来,第一个版本更可取。它使得为单个品牌寻找不同问题的答案和跨品牌寻找相同问题的答案变得更加容易。
回答这个问题似乎是个拙劣的替代品。首先,它排除了与questions表和brands表的简单外键关系。我非常喜欢明确的外键关系。
当然,要做到这一点,您将需要一种方法来存储“没有品牌”或“品牌无关”。一种方法是使用NULL来回答这些问题。
https://stackoverflow.com/questions/54834274
复制相似问题