写点什么

数据正规化真的那么好吗?

  • 2007-08-15
  • 本文字数:1203 字

    阅读完需:约 4 分钟

正规化(Normalization)是数据库设计的基础之一。最近,关于正规化的一些讨论中正在形成一种观点,即将反正规化(Denormalization)作为一种更具伸缩性的解决方案。

几星期前,Pat Helland 在其博客给出一个简短介绍,称“正规化适合于胆小鬼”。Pat 一开始就声称(很明显)我们正规化是为了避免更新异常,但接下来做出了一系列有趣的短评:

  • 许多类型的计算问题本质上是只增(Append-Only)的,用他的话来说是“会计不使用橡皮擦”。因此,对于不变的数据没有必要去进行正规化(除非你真的需要那些空间)。
  • 开发者使用“完整的”业务对象来工作。这些业务对象总是反正规化的完整视图。

作为另一个博客,你可以很容易驳回 Pat 的言论——除非你注意到 Pat 有与数据库系统长期为伍的经历,这包括,如作为 SQL Server Service Broker 的首席架构师、COM+ 团队的奠基人之一。Pat 还花了几年时间为 Amazon 工作——并且 Werner Vogels(Amazon 的 CTO)确实提过可以考虑反正规化实体,以得到更好的伸缩性和效率。这些言论是他在 QCon 上关于可用性和一致性(最近发布于此)的演讲中提及的。

Andres Aguiar 评论说,除了“无需正规化不变数据”,你甚至都不需要删除数据:

另一个想法是,你事实上都不需要删除 / 更新数据库。“删除”一行意味着设置 InvalidationTimestamp = now(),更新一行意味着设置 InvalidationTimestamp = now() 的同时新增一行,使其 SinceTimestamp= now() 且 InvalidationTimestamp = null(你实际上需要两组日期,这将在另一篇帖子里讨论)。现在,如果你把两个想法合在一起,那么所有的数据都是不变的,所以你不需要正规化任何东西。

通过分析这一点,Andres 提到一个障碍:这种情形下会使每张表产生大量数据行(译注:原文是 column,但根据上下文的意思,应该是数据行才更有意义。),而数据库并未准备好应对这种情形。如果你归档更老的数据,那么它是可以得到解决的。

Dare Obasanjo 认为

“数据库反正规化是一种效率优化,但这应该作为最后一道防线。应该在创建数据库索引、使用 SQL 视图和实现应用特定的内存缓存之后。”

然而,Dare 认同:当你需要大规模计算时,你可能需要反正规化,并举 Flickr 为例。

正如 Cal Henderson(Flickr 的 Web 开发领导)在 2004 年关于 Flickr 架构演讲中所说的:Join 效率低下(27 页)。作为结论:

* 正规化的数据适合于胆小鬼
\* 多处保存数据的多重副本
\* 让搜索更快些
\* 必须在应用逻辑中确保一致性

一篇由 Jason Kottke 于 2004 年撰写的博文中,表露出了与 Pat 的博文和 Cal 演讲中第一点类似的观点。Jason 解释,在 Flickr 的情形中,每次 Insert/Delete 或 Update 会有 13 次 Select,这是他们为什么选择反正规化的原因。

Pat 在其介绍的结尾总结:

“人们正规化‘因为他们的教授这么说的’”

是时候反思数据库正规化的咒语了吗?一些更大的网站似乎这么认为,你的感觉呢?

查看英文原文: Data normalization, is it really that good?

2007-08-15 05:052041
用户头像

发布了 255 篇内容, 共 52.4 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:Redis分布式锁你遇到过哪些坑?

Java全栈架构师

Java redis 程序员 面试 后端

手写JS函数的call、apply、bind

helloworld1024fd

JavaScript

ClassLoader 隔离性的基石是namespace,证明给你看

小小怪下士

Java 程序员 面试

版本更新 | Towify V1.24.0 有哪些实用新功能?汇总来了!

Towify

分享一下MySQL数据库中好玩的14个小玩意

Java永远的神

Java MySQL 数据库 程序员 后端

面试官:vue2和vue3的区别有哪些?

bb_xiaxia1998

Vue

腾讯前端手写面试题及答案

helloworld1024fd

JavaScript

Spring Cloud 应用 Proxyless Mesh 模式探索与实践

阿里巴巴云原生

阿里云 微服务 云原生

Dubbo架构设计与源码解析(一) 架构设计

京东科技开发者

云原生 dubbo Java、 架构设计 分布式架构

昨天,同事优化加锁方式时,出现死锁了

华为云开发者联盟

高并发 开发 华为云 12 月 PK 榜

一文盘点Zebec生态的收益模型

西柚子

说说你对Vue的keep-alive的理解

bb_xiaxia1998

Vue

关于Kubernetes中如何访问集群外服务的一些笔记

山河已无恙

12月月更

说说Vue响应式系统中的Watcher和Dep的关系-面试进阶

bb_xiaxia1998

Vue

实践丨GaussDB(DWS)资源管理排队原理与问题定位

华为云开发者联盟

数据库 华为云 12 月 PK 榜

Vue.$nextTick的原理是什么-vue面试进阶

bb_xiaxia1998

Vue

NeurIPS 2022:基于语义聚合的对比式自监督学习方法

华为云开发者联盟

人工智能 华为云 论文 12 月 PK 榜

问:React的setState为什么是异步的?

beifeng1996

React

web前端经典react面试题

beifeng1996

React

必会vue面试题(附答案)

bb_xiaxia1998

Vue

前端一面必会vue面试题(边面边更)

bb_xiaxia1998

Vue

老生常谈React的diff算法原理-面试版

beifeng1996

React

京东前端高频vue面试题(边面边更)

bb_xiaxia1998

Vue

前端vue面试题集锦1

bb_xiaxia1998

Vue

数据可视化图表系列解析——柱状图

Data 探险实验室

数据分析 可视化 数据可视化 BI 分析工具 可视化数据

社招前端二面react面试题整理

beifeng1996

React

计算存储分离在京东云消息中间件JCQ上的应用

京东科技开发者

容器 中间件 存储分离 消息中间件 存储计算分离

2022 Gartner全球数据库魔力象限发布,腾讯云数据库入选

腾讯云数据库

数据库 tdsql Gartner 腾讯云数据库

vivo 云原生容器探索和落地实践

vivo互联网技术

机器学习 AI 容器 云原生 k8s

时隔3个月,Uber 再遭数据泄露...

SEAL安全

数据泄露 uber 第三方风险 12 月 PK 榜

HarmonyOS年度开发者活动,赋能逾万名开发者开启HarmonyOS学习之旅

Geek_2d6073

数据正规化真的那么好吗?_数据库_Arnon Rotem-Gal-Oz_InfoQ精选文章