|
1
29
您可以使用带有VARCHAR主键的查找表,主数据表的列使用外键,并进行级联更新。
此解决方案具有以下优点:
令我惊讶的是,在这个问题上有这么多其他人似乎对什么是“正常化”有错误的想法。使用代理键(无处不在的“id”)与规范化无关! @MacGruber回复: 是的,尺寸是一个因素。例如,在InnoDB中,每个次索引都存储给定索引值所在行的主键值。因此,辅助索引越多,使用“庞大”数据类型作为主键的开销就越大。 这也会影响外键;外键列必须与它引用的主键的数据类型相同。您可能有一个小的查找表,因此您认为50行表中的主键大小无关紧要。但该查找表可能被数百万或更多用户引用 其他表中的行数! 对于所有的情况都没有正确的答案。对于不同的情况,任何答案都可能是正确的。您只需了解权衡,并尝试根据具体情况做出明智的决定。 |
|
|
2
5
或者,您也可以通过制作“颜色”表对其进行更多的规范化:
后者的最终结果是增加了一些复杂性,而不是:
这是一笔大买卖吗?事实上,这是关系设计模型的基础——规范化允许您防止数据中可能存在的不一致。但每一个这样的情况都会增加一个风险 一点点
如果这些都不适用,我将很难找到另一个(好的)正常化的理由。如果您只是想确保该值是一组特定(小)合法值中的一个,那么最好使用一个约束,该约束表示该值必须位于特定列表中;保持简单,如果需要,您可以随时“升级”到单独的表。 |
|
|
3
3
没有人考虑过的一件事是,如果查找表中的数据会随着时间的推移而变化,并且连接到的记录是历史记录,则不会连接到查找表。示例是零件表和订单表。供应商可能会删除零件或更改零件号,但订单表应准确显示订购时订购的内容。因此,它应该查找数据以进行记录插入,但不应该加入查找表以获取有关现有顺序的信息。相反,零件号、说明和价格等应存储在订单表中。这一点尤其重要,以免价格变化通过历史数据传播,使您的财务记录不准确。在这种情况下,您还希望避免使用任何类型的级联更新。 |
|
|
4
2
rauhr.myopenid.com wrote :
这不是第四范式。这是一个常见的错误,称为一次真正的查找: http://www.dbazine.com/ofinterest/oi-articles/celko22 |
|
5
1
|
|
|
6
1
|
|
|
7
1
您甚至可以将始终针对视图编程作为一项规则,让视图获得查找。
在oracle中,如果需要,甚至可以将视图转换为物化视图。 |
|
|
Lyres · Ruby存储查询数据 8 年前 |
|
|
em1031 · 查找上一期价值的最快方法? 8 年前 |
|
|
DanielWoodward · MongoDB$查找值返回数组 8 年前 |
|
|
Milly B. · Google sheets查找和汇总 8 年前 |
|
|
C_psy · 将匹配列从长转换为宽 8 年前 |
|
|
Luis Costa · Mongo 3.6多条件聚合查找 8 年前 |