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

时间:2013-10-20 20:26:09

标签: mongodb relational-database left-join normalization nosql

我听到更多关于NoSQL的信息,但是还有人给我一个明确的解释,说明如何使用它来代替relational databases

我读过它不能left joins,所以我试图弄清楚你如何能够使用这样的数据存储。从阅读:Preserve Joins by code in MongoDB看起来似乎只是建立一个大表,好像你已经在它上面做了连接。

如果上述陈述属实,那么我可以看到它是如何使用的。但是我很好奇你如何处理重复数据...作为规范化的概念,帮助你消除冗余并确保数据的一致性(例如像大写,空格等的轻微修改)......

我们是否只是为了可扩展的速度而牺牲数据的一致性,还是我错过了什么?我们非常感谢任何澄清,以及帮助我​​理解的任何资源。

EDT

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

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

但这引发了更多问题:

  1. 这让我想知道何时使用NoSQL与何时不使用的真实例子?
  2. 通过denormalizing数据,您应该能够解决关系数据库所做的所有相同问题......但是有关于如何使用关系数据库normalize数据的规则。是否有可用于帮助他们denormalize数据使用NoSQL解决方案的规则?
  3. 您何时可以考虑同时使用NoSQL解决方案同时使用relational database的任何示例?

1 个答案:

答案 0 :(得分:13)

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

当发票有多个头寸时,您不会将这些头寸放入单独的集合中。你可以将它们嵌入一个数组中。

  

这让我想知道何时使用NoSQL与不使用NoSQL的真实例子?

有许多不同的NoSQL数据库,每个数据库都考虑到不同的用例。但是你把这个问题标记为MongoDB,所以我认为你的意思是MongoDB。

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

首先,它可以很好地扩展。

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

其次,它允许异构数据。

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

它不能做什么?

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

还有一些用例MongoDB不适合。

  • MongoDB不执行JOIN。当您的数据非常关系并且非正规化时,它会适得其反,它可能是您产品的不良选择。但是你可能想看看像Neo4j这样的图形数据库,它比关系数据库更关注关系。 更新2016: MongoDB 3.2现在对$lookup aggregation stage提供了基本的JOIN支持,但与关系数据库和图形数据库相比,它的功能仍然非常有限。
  • MongoDB不进行交易。至少不是复杂的交易。某些仅影响单个文档的操作保证是原子的,但只要您影响多个文档,就不能保证中间不会发生其他查询并找到不一致的状态。
  • MongoDB不适合临时报告。它的数据挖掘选择受到严重限制。相当新的聚合函数帮助,MapReduce也可以解决一些令人惊讶的复杂问题,当你学会聪明地使用它时,但SQL通常有更好的工具来处理这类事情。
  

通过对数据进行非规范化,您应该能够解决关系数据库所做的所有相同问题......但是有关于如何使用关系数据库规范化数据的规则。是否有规则可以帮助他们将数据非规范化以使用NoSQL解决方案?

关系数据库大约有40年的历史。他们的理论是计算机科学中一个研究得很好的课题。有关于它们背后的理论的书籍全书。到目前为止,每个可以想象的角落都有一个可靠的解决方案。

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

  

关于何时考虑将NoSQL解决方案与关系数据库并行使用的任何示例?

如果可能,我建议不要在同一产品中使用两种不同的数据库技术:

  • 维护和支持该产品的任何人都必须熟悉这两种技术
  • 故障排除变得更加困难
  • 系统管理员需要保持其他数据库的运行和更新
  • 您还有一个可能导致停机的故障点

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