我有一个查找表,我们插入组合的值,如情况12和20. 我很担心它,但我不确定这是否是一种不好的做法。那么这怎么会有害呢?组合查找表 - 数据库设计
PK.........Name
1.............A
2.............B
4.............C
8.............D
12............C&D
16............E
20............C&E
我有一个查找表,我们插入组合的值,如情况12和20. 我很担心它,但我不确定这是否是一种不好的做法。那么这怎么会有害呢?组合查找表 - 数据库设计
PK.........Name
1.............A
2.............B
4.............C
8.............D
12............C&D
16............E
20............C&E
从描述中无法确切地说明问题是什么。但是,如果名称列包含任何不只是一个名称的值,那么您的设计违反了规范化规则。
在您的示例中,唯一性定义会变得模糊,您如何判断列表中是否存在重复(E,C & E,E & C,C)?是(C & E)与(E & C)相同吗?
对您的示例进行扩展,假定Name列与标题组合在一起,那么查找“Alex”和“Mrs”可能会很困难。例如,你将如何编写查询?这是否像“麦酒太太”或“亚历克斯夫人” - 如果有人有'太太'的名字,但实际上是一个先生?那么柱分离器呢?
如果无法进行准确的查询,那么更新也会导致问题。将(C & E)更新为(C)或(E)的值是否有效?您可以运行查询将所有(C & E)更改为(C & D)?如果(C & D)已经存在,你会允许(C & D & D)在这种情况下?
说了这么多之后,在某些情况下,这种设计可能会正常工作,特别是当两个连接列都是强制性的并且数据严格用于查找时(例如,简单的Contact-us表单中的Country-State),但我个人不会不赞成,因为没有从中获得真正的价值。
取决于值是否如C
,D
和E
应从数据管理的角度来看原子。
例如,对于PK = 12,是否需要独立于C
(反之亦然)查询或修改D
?如果是的话,存储D
内C&D
违反atomicity原则,因此1NF,在这种情况下,你应该将表拆分为1:N的关系:
“1” 表:
ID
--
12
“N”表({ID,Name}是关键):
ID Name
-- ----
12 C
12 D