Jeffrey Cross
Jeffrey Cross

什么时候去反规范化

Dare Obasanjo和Jeff Atwood的博客上都有一些数据库宗教战争,所有这些都涉及数据库规范化:何时进行规范化,何时进行规范化以及决策所依据的性能和数据完整性问题。

这是论证的根源。如果设计无法提供必要的性能结果,那么我们所有关于数据库设计的知识就无关紧要了。

第三种常规形式有助于确保数据库中的关系反映现实,您没有重复数据,系统中的零到多关系可以适应任何潜在的情况,并且不会浪费和保留该空间未明确使用的数据。缺点是系统中的单个对象可能跨越许多表,并且随着数据集变大,从系统中提取实体所需的连接和/或多个选择开始影响系统的性能。

通过非规范化,您可以妥协并将其中一些关系拉回到父表中。例如,您可能决定用户只能拥有3个电话号码,1个工作地址和1个家庭住址。通过这样做,您已满足常见方案的要求,并且无需加入单独的地址或联系号码表。这不是一种罕见的妥协。只需查看普通手机中的联系人表格即可查看其中的实际情况。

杰夫写道:

这两种解决方案各有利弊。那么让我向您提出问题:哪个更好 - 规范化数据库,还是非规范化数据库?

特技提问!答案是没关系!在你有数百万行数据之前,就是这样。对于小n来说,一切都很快。

那么对于大n来说,解决方案是什么?根据我的个人经验,您通常可以双管齐下。

从一开始就将数据库设计为3NF,以确保数据完整性,并为增长,附加关系以及未来查询和索引的合理性留出空间。只有当您发现存在性能问题时,才需要考虑优化。通常,这可以通过更智能的查询来完成。如果不能,则从规范化源中导出非规范化数据集。这可以像父表中的额外字段一样简单,它可以在插入时获得排序信息,也可以是一个完整的对象缓存表,它可以在某个固定的时间间隔或者甚至在重要的情况下从官方源更新。

阅读讨论并分享您的意见。对我来说,最重要的是,没有一种解决方案适合每个现实世界的问题。最终,您的最终设计必须反映正在解决的问题的独特需求。

何时不规范SQL数据库可能正常化不正常

分享

发表评论