首页 数据库 mysql教程 你在以错误的原因看待NoSQL数据库吗?

你在以错误的原因看待NoSQL数据库吗?

Jun 07, 2016 pm 04:41 PM
nosql 原因 地址 数据库 错误

原文地址(source):http://maurizioturatti.com/blog/2015/01/06/using-nosql-wrong-reason/ 我最近看到一篇报道,在某些条件下,PostgreSQL在很多重要地方胜过MongoDB,这让我想起了关于数据存储选择方面的、不同选项背后的理论,特别是在SQL和NoSQL解决

原文地址(source):http://maurizioturatti.com/blog/2015/01/06/using-nosql-wrong-reason/

PostgreSQL与MongoDB的性能评测

我最近看到一篇报道,在某些条件下,PostgreSQL在很多重要地方胜过MongoDB,这让我想起了关于数据存储选择方面的、不同选项背后的理论,特别是在SQL和NoSQL解决方案之间的天真比较——不幸的是,这一幕经常发生。

上面的评测由EnterpriseDB创建,EnterpriseDB是开发PostgreSQL的商业公司(因此测评可能会有一点儿偏见……),除了这个明显的事实,我已经注意到PostgreSQL是让人惊奇的产品,在这一点上,我推荐它作为亟待解决的、大部分数据存储问题的、最佳方案之一。有着非凡性能需求的知名企业都正在PostgreSQL上投入巨大。

然而,我这里的观点稍微不同:我自问,大多数公司是否正确地看待着“NoSQL”解决方案、以及性能需求是否已经成为他们急需考虑的。比如,让我们看看MongoDB词条在维基百科上的解释,它是我这些天经常在用的、一种数据库:

MongoDB是一种跨平台的面向文档的数据库。作为一种NoSQL数据库,MongoDB没有采用传统的基于表的关系型数据库结构,而是钟情于带有动态模式的类JSON文档(MongoDB称之为BSON),使得特定类型的应用程序里的数据集成更容易、更快速。

我想刻意强调句子中的“特定类型的应用程序里”,因为这恰恰就是我要说的:你不能仅仅因为性能就抛弃关系型数据库、转而采用面向文档的数据库,因为这是愚蠢的动机:一个调优的SQL数据库每秒处理的事务能够超过14000条,因此如果你超过了这个量级,说明你已经在一流的公司里了,有着首要的扩展需求:恭喜!

相反,

当实体大部分与树形结构相关,且关系模型持续被迫地创建join或重度反规范化关系而超越了其合理性时,文档数据库就是优于关系型数据库的更好的解决方案。

在这种情况下,数据模型符合上面的约束,那么面向文档结构有能力比关系型模型创建更少的、与面向对象设计不匹配的现象。据我们所知,所有重要的关系型数据库模式创建了大量的与对象模型相关的属性,这就是饱受诟病的对象关系阻抗不匹配(Object-relational impedance mismatch)问题。面向对象的系统通常是树状结构,它比其它模型能够更好地适应文档数据库,图数据库【注1】除外,很明显,图数据库实现了一个图的大部分通常表现。

在SQL领域之外,我总是建议不要低估你和团队正在失去大部分久经考验的工具和专长,你们每天都在不自觉地应用着。我看到过很多人费力地从NoSQL仓库抽出非常基本的信息,而这些信息用关系型数据库就可以容易地实现,主要是因为多年来人们都是这样做的。那么,NoSQL数据库在管理事务上,和“正统的”关系型数据库相比,有着很大的不同:用最终一致性(Eventual Consistency)和幂等服务(Idempotent Services) 设计应用程序,你知道意味着什么吗?

我不是说你不应该采用新技术,因为我和公司已经为此做了很多,但是我的最终建议是:

采用适合你的领域模型(domain model)【注2】的数据存储方案,不要过早地性能伪优化:你可能在尽量解决错误的问题。

  • 注1:图数据库也可称为面向/基于图的数据库,对应的英文是Graph database。图数据库的基本含义是以“图”这种数据结构存储和查询数据,不是存储图片的数据库。图数据库的基本存储单元为:节点、关系、属性。http://zh.wikipedia.org/wiki/%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93
  • 注2:领域模型可以被看作是一个系统的概念模型,用于以可视化的形式描述系统中的各个实体及其之间的关系。领域模型记录了一个系统中的关键概念和词汇表,显示出了系统中的主要实体之间的关系,并确定了它们的重要的方法和属性。因此,对应于用例所描述的动态视图,领域模型提供了一种对整个系统的结构化的视图。领域模型的一个好处是描述并限制了系统边界。http://zh.wikipedia.org/wiki/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B

The post 你在以错误的原因看待NoSQL数据库吗? appeared first on 腊八粥.

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows Update 更新提示Error 0x8024401c错误的解决方法 Windows Update 更新提示Error 0x8024401c错误的解决方法 Jun 08, 2024 pm 12:18 PM

目录解决方法一解决方法二一、删除Windows更新的临时文件二、修复受损的系统文件三、查看并修改注册表项四、关闭网卡IPv6五、运行WindowsUpdateTroubleshootor工具进行修复六、关闭防火墙和其它相关的杀毒软件。七、关闭WidowsUpdate服务。解决方法三解决方法四华为计算机Windows更新出现“0x8024401c”报错问题现象问题原因解决方案仍未解决?最近web服务器因为系统漏洞需要更新,登录服务器之后,更新提示错误代码0x8024401c解决方法一

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate多态映射可映射继承类到数据库,提供以下映射类型:joined-subclass:为子类创建单独表,包含父类所有列。table-per-class:为子类创建单独表,仅包含子类特有列。union-subclass:类似joined-subclass,但父类表联合所有子类列。

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

手机如何查看MAC地址(简单操作让你轻松获取设备的MAC地址) 手机如何查看MAC地址(简单操作让你轻松获取设备的MAC地址) Apr 19, 2024 pm 06:19 PM

我们可能需要查看手机的MAC地址、在一些特定的情况下,比如设置无线网络过滤或者进行设备管理。本文将教你如何通过手机轻松获取设备的MAC地址。1.什么是MAC地址2.手机系统:Android和iOS3.Android系统中查看MAC地址的方法4.iOS系统中查看MAC地址的方法5.使用设备管理应用查看MAC地址6.通过无线路由器查看连接设备的MAC地址7.通过第三方应用程序查看MAC地址8.通过手机设置中的开发者选项查看MAC地址9.使用网络分析工具查看MAC地址10.通过命令行方式查看MAC地址

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

如何在PHP中处理数据库连接错误 如何在PHP中处理数据库连接错误 Jun 05, 2024 pm 02:16 PM

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

如何用 Golang 连接远程数据库? 如何用 Golang 连接远程数据库? Jun 01, 2024 pm 08:31 PM

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。

如何在 Golang 中使用数据库回调函数? 如何在 Golang 中使用数据库回调函数? Jun 03, 2024 pm 02:20 PM

在Golang中使用数据库回调函数可以实现:在指定数据库操作完成后执行自定义代码。通过单独的函数添加自定义行为,无需编写额外代码。回调函数可用于插入、更新、删除和查询操作。必须使用sql.Exec、sql.QueryRow或sql.Query函数才能使用回调函数。

See all articles