我应该规范化我的数据库吗?

在现实世界中规范化

数据库规范化是应用程序开发的神圣之一。 您所读过的每本本科程序课程或您已阅读过的书籍都可能会引发正常化数据库的重要性。

现在是时候向真理主义挑战了。 有时可以将数据库非规范化!

你应该什么时候正常化?

数据库规范化可保护数据的完整性。 在许多情况下,这是一个好主意,你应该开始任何数据库设计工作,并考虑正常化。 如果你可以规范你的数据库,那就去吧! 事实上,下面是关于如何规范化你的数据库的一些实用建议:

底线是,你应该规范你的数据库,除非你有一个真正的理由不这样做。 规范化通常是合理的设计实践。 它减少了冗余信息,优化了性能,并降低了由于在数据库的不同角落中存储相同数据而导致数据完整性问题的可能性。

一些好的理由不会正常化

也就是说,有一些很好的理由不对数据库进行规范化。 我们来看几个:

  1. 联接是昂贵的 。 规范化数据库通常涉及创建大量表。 事实上,您可以轻松完成您认为应该是跨越五个或十个表的简单查询。 如果你曾经试过做过五表连接,你知道它原则上是有效的,但它在实践中的速度非常缓慢。 如果您正在构建一个依赖于针对大型表的多连接查询的Web应用程序,您可能会发现自己在想“如果只有这个数据库没有正常化!”当您在脑海中听到这种想法时,现在是时候了考虑反规范化。 如果您可以将该查询使用的所有数据都粘贴到单个表中,而不会严重影响数据的完整性,那就去做吧! 成为一名反叛者并将你的数据库进行非规范化。 你不会回头看!
  2. 标准化设计很困难 。 如果您正在处理复杂的数据库模式 ,那么您很可能会发现自己在规范化的复杂性背后对抗桌面。 作为一个简单的经验法则,如果你花费了一整天的时间来弄清楚如何移动到第四范式,那么你可能会将标准化过度。 退后一步,问自己是否值得继续。
  1. 快速和肮脏应该快速和肮脏 。 如果你只是开发一个原型,只需快速做任何工作。 真。 没关系。 快速的应用程序开发有时比优雅的设计更重要。 一旦你准备好超越原型阶段,记得回头仔细看看你的设计。 您为快速而肮脏的数据库设计付出的代价是,您可能需要将其扔掉,并在需要为生产构建时重新开始。
  2. 如果你使用的是NoSQL数据库 ,传统的规范化是不可取的。 相反,使用更加宽容的BASE模型设计您的数据库。 当您存储非结构化数据(如电子邮件,图像或视频)时,这非常有用。

一些谨慎的词语

数据库规范化通常是一个好主意。 你应该尽量遵循正常化的原则,当这似乎是合理的。 但是,如果所有指标都指向标准化过于复杂而无法实施,那么请考虑一种在保护数据的同时完成工作的方法。

最后 - 如果您确实选择偏离正常化规则,请对您如何执行数据库完整性保持警惕。 如果您存储了冗余信息,请放置触发器和其他控件以确保信息保持一致。