数据库规范化

时间:2011-04-20 18:15:53

标签: sql database-normalization

我最近将一个非常大的数据库表拆分成了较小的,可管理的表,而且大多数情况下我对我的工作感到满意,并且我觉得数据已正确规范化。

但是有一个例外。有问题的表来自产品数据库,该数据库存储有关公司销售的(您猜对了)产品的信息。我已将大部分信息分为两个表:ProductBaseProductBasePackaging

这些表格包含与基本部件号相关的信息,而不是单个产品(每个基本号码有多个产品)。

ProductBase包含相当一般的信息,例如MarketingCopyKeywords等,以及有关构造的信息,即材料,组件等。

ProductBasePackaging当然包含有关包装的数据。

现在我正在编写数据操作的应用程序,我开始猜测自己了。现在我似乎已经让自己变得更难了,因为我必须跟踪使用相同密钥的多个表(基本部件号)。或者我是否正确地将它们分开并且可能更进一步将结构分成它自己的表格?

我非常精通使用sql,但这是我第一次真正设计数据库结构,更不用说重构大型现有数据库了。所以基本上我要问的是,我应该有多个具有相同键的表,这些表由数据类型分隔,或者在单个表中保存在一起,我可以使用相同的键从一个表中引用我需要的所有内容吗?

对不起,我知道这很有意思,我希望它有道理,感谢所有通过的人!

2 个答案:

答案 0 :(得分:8)

正常化现在可能看起来像a **中的痛苦 - 但相信我,从长远来看,你会很高兴你做到了!随着时间的推移,除了厨房水槽之外的所有东西的非标准化的“平面”桌子将变得非常难以管理,数据不一致将会蔓延,在您知道之前,您有一大堆垃圾 - 错误 - 数据不会再有意义了!

是的,加入表可能有点工作 - 但特别是对于显示数据,你一定要查看 views ,这可以帮助你编写一次JOIN,然后将它们用作“虚拟表” “再次举办一切。

数据库规范化 - 最高可达3NF - 肯定是好事(TM)!我总是建议这样做,然后可能在那时引入一些有限的去规范化,其中性能需求可能需要它 - 但只能以一种非常受控的方式,并且你完全理解和知识,你实际上已经再次正常化了一些东西

答案 1 :(得分:3)

答案是取决于

这取决于您通常查询的内容,通常查询的方式,查询频率,表格保存所有数据的大小等等。取决于。
如果您需要定期查询聚合或派生数据,并且编译它的过程需要“很长时间”,那么您可能想要规范化的示例。 通常虽然我认为数据应该规范化。

话虽如此,我不确定你所描述的是“正常化”和它的分离。规范化将涉及删除不同列中的重复数据。

让我们以你的包装为例......在我看来,你已经在某些ProductBasePackaging中创建了一个与PartNumber相关联的ProductBase或其他内容的记录。 / p>

实际上,如果你正在规范化数据...你只有每种类型的包装都有一个ProductBasePackaging行...就像你运送1000种不同的产品但只使用10种不同类型的盒子一样。 ProductBasePackaging将包含10行,每行包含一个唯一框中的信息...然后ProductBasePackagingID

引用其所需的框