假设我们进行了一项调查,其中一些问题在多个实体之间提出。
例如:
汽车品牌= [品牌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
用于此类答案。