草庐IT

mongodb - NoSQL 与关系数据库与可能的混合

coder 2023-05-05 原文

我听到了更多关于 NoSQL 的消息,但还没有人给我一个关于如何使用它而不是关系数据库的清晰解释。

我读过它不能做 left joins ,所以我试图弄清楚如何使用这样的数据存储。来自阅读:Preserve Joins by code in MongoDB似乎建议只制作一张大 table ,就好像您已经在上面进行了连接一样。

如果上面的说法是正确的,那么我可以看到它可以如何使用。但是,我很好奇您将如何处理重复数据。作为规范化的概念,可以帮助您消除冗余并确保数据的一致性(例如,大写、空格等细微修改)...

我们是否只是为了可扩展的速度而牺牲数据的一致性,还是我遗漏了什么?

编辑

我一直在做更多的挖掘,发现以下问题的答案有助于澄清我的理解:

  • Why Google's BigTable referred as a NoSQL database?
  • How do you track record relations in NoSQL?

  • 从这些答案来看,我对一致性的理解似乎是正确的。看起来 NoSQL 应该用于特定的问题类型,如果您需要关系,则应该使用关系数据库。

    但这引发了更多问题,例如:
  • 这让我想知道何时使用 NoSQL 与何时不使用的现实生活示例?
  • 通过对数据进行反规范化,您应该能够解决关系数据库所做的所有相同问题……但是关于如何使用关系数据库对数据进行规范化是有规则的。是否有可以用来帮助他们对数据进行非规范化以使用 NoSQL 解决方案的规则?
  • 关于何时考虑将 NoSQL 解决方案与关系数据库并行使用的任何示例?
  • 最佳答案

    MongoDB 能够拥有包含其他文档数组的文档。这解决了许多在有理数据库中存在关系的情况。

    当发票有多个位置时,您不会将这些位置放入单独的集合中。您可以将它们作为数组嵌入。

    It makes me wonder about real life examples of when to use NoSQL versus when not to?



    有许多不同的 NoSQL 数据库,每一种数据库的设计都考虑了不同的用例。但是您将这个问题标记为 MongoDB,所以我假设您特别指的是 MongoDB。

    与关系型数据库相比,MongoDB 有两个主要优势。

    首先,它的伸缩性很好。

    当数据库太慢或太大时,您可以通过创建一个集群或多个分片的副本集来轻松添加更多服务器。这对于大多数关系数据库几乎没有效果。

    其次,它允许异构数据。

    例如,想象一下计算机硬件商店的产品数据库。产品有哪些特性?所有产品都有价格和供应商。但是 CPU 有一个时钟频率,硬盘驱动器和 RAM 芯片有一个容量(这些容量没有可比性),显示器有一个分辨率等等。您将如何在关系数据库中设计它?您要么创建一个很长的 productID-property-value 表,要么创建一个非常宽且稀疏的 product 表,其中包含您可以想象的每个属性,但其中大多数是 NULL对于大多数产品。这两种解决方案都不是很优雅。但是 MongoDB 可以更好地解决这个问题,因为它允许集合中的每个文档具有一组不同的属性。

    它不能做什么?

    作为一项相当新的技术,关于它的文献并不多。围绕它的软件生态系统也不是那么好。您可以获得的用于关系数据库的工具通常更加 Shiny 。

    还有一些 MongoDB 不太适合的用例。
  • MongoDB 不执行 JOIN。当您的数据非常相关并且非规范化时,它会适得其反,这对您的产品来说可能是一个糟糕的选择。但是你可能想看看像 Neo4j 这样的图形数据库,它比关系数据库更关注关系。 2016 年更新: MongoDB 3.2 现在通过 $lookup aggregation stage 有了基本的 JOIN 支持,但与关系数据库和图形数据库相比,它的功能仍然非常有限。
  • MongoDB 不做交易。至少不是复杂的交易。某些仅影响单个文档的操作被保证是原子的,但是一旦您影响多个文档,您就不能保证在两者之间不会发生其他查询并发现不一致的状态。
  • MongoDB 不适合临时报告。它用于数据挖掘的选择受到严重限制。当您学会巧妙地使用 MapReduce 时,相当新的聚合函数会有所帮助,而且 MapReduce 还可以解决一些令人惊讶的复杂问题,但 SQL 通常具有更好的工具来解决此类问题。

  • By denormalizing the data, you should be able to solve all of the same problems that relational databases do... But there are rules on how to normalize data with relational databases. Are there rules that one can use to help them denormalize the data to use a NoSQL solution?



    关系数据库已经存在了大约 40 年。他们的理论是计算机科学中一个经过深入研究的主题。有很多关于它们背后的理论的书籍。到目前为止,对于每个可以想象的极端情况,都有一个按书的解决方案。

    但另一方面,NoSQL 数据库是一项相当新的技术。我们仍在寻找最佳实践。最常见的建议是:“用你自己的头脑。想想最常执行的查询,并为它们优化你的数据模式。”

    Any examples on when you might want to consider using both a NoSQL solution in parallel with a relational database?



    如果可能,我建议不要在同一产品中使用两种不同的数据库技术:
  • 任何维护和支持产品的人都必须熟悉这两种技术
  • 故障排除变得更加困难
  • 系统管理员需要保持一个额外的数据库运行和更新
  • 您还有一个可能导致停机的额外故障点

  • 我只建议在满足您的要求时混合数据库技术,否则它不仅变得困难而且在物理上是不可能的。否则,请选择并坚持下去。

    关于mongodb - NoSQL 与关系数据库与可能的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482459/

    有关mongodb - NoSQL 与关系数据库与可能的混合的更多相关文章

    1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

      我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

    2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

      我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

    3. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

      我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

    4. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

      我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

    5. [工业相机] 分辨率、精度和公差之间的关系 - 2

      📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

    6. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

      因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

    7. ruby-on-rails - 如何让 datamapper 与 postgresql 数据库一起工作? - 2

      我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:

    8. ruby-on-rails - rails 多态关联(遗留数据库) - 2

      我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint

    9. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

      我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

    10. ruby - 如何测试正在使用 RSpec 和 Mocha 调用的混合类方法? - 2

      我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案

    随机推荐