【问题标题】:How can denormalization be attribute of NoSQL DB非规范化如何成为 NoSQL DB 的属性
【发布时间】:2017-09-15 15:27:19
【问题描述】:
在讨论 NoSQL DB 与传统 RDBMS 时,许多文章说,在 NoSQL-DB 中,所有相关数据都保存在一起,因此可以避免连接。因此检索数据更快。
简而言之,数据是非规范化的。非规范化也有缺点。例如冗余、额外空间、需要在多个地方更新数据等。
但不考虑非规范化的优缺点;它是数据库设计属性。它如何归因于特定的 DB-type ?
如果在给定的情况下,可以对数据进行非规范化,那么在 RDBM 中也可以实现同样的效果。
那么为什么非规范化被作为 NoSQL db 的属性来讨论呢?
【问题讨论】:
标签:
rdbms
denormalization
nosql
【解决方案1】:
您似乎在阅读炒作,而不是数据库设计文章。您可以对任何数据库进行非规范化。是的,NoSQL 适用于非规范化数据是一件好事的情况,例如,在存储文档时,使用子文档而不是连接到另一个表。当子文档不重复时,这最有效。当然,如果它们是重复的,那么你就会遇到非规范化数据的常见问题。
示例:人使用汽车。在关系数据库中,您将有一个 Persons 表、一个 Cars 表和一个联结表,可能是“CarsUsedByPerson”。在 NoSQL 系统中,您可能在“人”文档中嵌入了“汽车”文档。
当然,如果两个人使用同一辆车,那么你在多个地方有相同的数据,你需要在所有这些地方更新它,否则会不一致。
NoSQL 适用于需要性能多于一致性的情况。
【解决方案2】:
继 John Saunders 之后,您也可以对 RDBMS 中的数据进行非规范化 - 非规范化是大多数 NoSQL 数据库的属性(“大多数”表示“不包括图形数据库”),因为在许多情况下,您必须进行非规范化才能获得良好的性能。
继续他的例子,假设我有一个 Person 记录,它有一个 Car 记录的外键(在这个例子中,为了简化问题,每人一辆车),它有一个 Manufacturer 记录的外键.对于给定的人,我想要该人、他们的汽车以及他们的汽车制造商的记录。
在 RDBMS 中,我可以规范化这些数据并使用连接在一个查询中检索它们,或者我可以非规范化这些数据 - 非规范化读取将比规范化读取便宜一点,因为连接不是免费的,但在这种情况下,读取性能的差异可能并不显着。
我的 NoSQL 数据库可能不支持连接,所以如果我规范化这些数据,那么我将不得不对其进行三个单独的查找,例如使用键值数据库,我首先检索包含 Car 键的 Person,然后检索包含 Manufacturer 键的 Car,然后检索制造商;如果这些数据被非规范化,那么我只需要一次查找,因此性能提升将是显着的。在极少数情况下,NoSQL 数据库确实支持连接,那么几乎可以肯定它与位置无关,因此 Person、Car 和 Manufacturer 记录可能位于不同的服务器上,甚至可能位于不同的数据中心,从而导致连接非常昂贵。
因此,您的选项过于简单化的细分是:
- 传统的 RDBMS,适合标准化数据,但难以横向扩展
- NoSQL 数据库,相对容易横向扩展,但标准化数据有点垃圾
- 分布式 OLAP 数据库(例如 Aster、Greenplum),相对容易横向扩展,并且可以很好地处理标准化数据,但非常昂贵