【发布时间】:2013-04-22 09:36:30
【问题描述】:
假设我想规范化一个表格
itemID | itemDate | itemSource | type | color | size | material
254 03/08/1988 toyCo doll null 16 plastic
255 03/08/1988 toyCo car blue null plastic
256 03/08/1988 toyCo boat purple 20 wood
现在类型字段只能有 3 个值中的 1 个。 doll, car, or boat。 color, size, and material 的属性在功能上依赖于 type。正如您所看到的,type|doll 的项目不能确定color。我不知道这是否是一个问题。但继续前进。
type(pk) | color | size | material = 表 AitemID(pk) | itemDate | itemSource = 表 B
我们现在是 1nf。 我的问题是,type 键及其属性是否可以基于类型键的可能值?
typeDoll(pk) | size | material = 表 CtypeCar(pk) | color| material = 表 DtypeBoat(pk) | color | size | material 表 E
【问题讨论】:
-
但是C、D、E表都变成了一行的表,都具有相同的列结构和相同的列之间的功能依赖。你为什么追这棵树?你想达到什么目的?
-
他们不会是一排。可以有很多
dolls, cars, and boats。table C可以拥有多排不同颜色和材质的娃娃。我追逐这棵树的原因是:我想要纯数据表。如果稍后我将foo, foo2, foo3, foo4等列引入table A但这些列仅对具有type值doll的行有用,那么这意味着我可以创建boat和car具有空或空的行foo, foo2, foo3, foo4的值。我认为这是浪费。我说的对吗? -
大脑放屁警报!你当然是对的。但是,它们保持相同的列结构,具有相同的功能依赖关系。我相信你过度概括了。由于表 B 是一个查找表,除了它自己的维护之外,如果需要,它可以很容易地在以后被视图替换。从 C、D、E 开始作为基表 B 上的视图,如有必要,可将其反转。
-
我不认为它过于笼统。我要实现的目标称为多态性。它有很好的OOB用途。我想将一个外键限制为许多可能的表键。
-
我仍然认为你是想钉钉子。
标签: sql database-design entity-relationship normalization