我们不能用 RDBMS 模拟 nosql 键值对数据库吗

Posted

技术标签:

【中文标题】我们不能用 RDBMS 模拟 nosql 键值对数据库吗【英文标题】:Can't we simulate nosql key value pair databases by RDBMS 【发布时间】:2021-07-03 04:06:40 【问题描述】:

我读到使用 Amazon DynamoDB 的优势之一(除其他外)是我们可以将 Java 对象转换为 XML/JSON 并作为值存储在 nosql 数据库中。但是我们不能只在字符串中序列化 java 对象,并通过 2 个字段表让 RDBMS 模拟键值 nosql 数据库 - key 和 varchar/blob 。 varchar 可以存储序列化的字符串。这个引用的好处是不是说错了?

此外,RDBMS 也可以是分布式的,因此可以进行扩展。因此,我看到使用 nosql 的唯一好处是让每个事务都符合 ACID,从而使操作更快。这是唯一的优势吗?

【问题讨论】:

【参考方案1】:

分布式 RDBMS 是一件复杂的事情。因为它可以支持不是键/值而是更复杂的关联表的数据,因此很难以最佳方式拆分数据。对于您可能希望针对该数据运行的所有类型的查询,无法以最佳方式执行此操作。

而如果它是键/值数据,您可以运行的查询类型更简单,因此问题空间要简单得多。确保您以不会损害查询的方式拆分数据变得更容易,因为无论如何您的查询主要是按键查找。只要您可以通过键确定地将查询映射到该键所在的节点,您的查询就会保持优化。

此外,扩展更容易。向集群添加新节点涉及重新映射哪些键位于哪些节点上,但这可以在键/值存储中更轻松地完成。没有要跟踪的外键。

键/值存储更容易扩展,因为它们不会像 RDBMS 那样尝试强制执行 ACID 属性或数据完整性。

您假设如果您只使用 RDBMS,就好像它只是一个键/值存储一样,您可以做这些事情,这是真的。但是 RDBMS 软件是在您可能需要 ACID 和数据完整性的假设下设计的,因此默认情况下会强制执行这些内容。

RDBMS 是否可以设计为服务于任一工作负载,并具有完全禁用 ACID 和数据完整性的配置参数?当然。如果您发现使用这些配置选项实现的 RDBMS,请随意将其用作键/值存储。 (我不知道。)

或者您可以只使用从一开始就围绕该概念设计的键/值存储。您不必强制键/值存储模仿键/值存储。

这就是存在不同技术的原因——它们针对不同类型的工作进行了优化。这也是有不同类型的螺丝头的原因。没有一个比另一个“更好”,它们是为不同的工作而设计的。每个人都或多或少地替代了其他人做得好的工作。

【讨论】:

喜欢螺丝头的比喻。我一定会记住/重复使用那个!

以上是关于我们不能用 RDBMS 模拟 nosql 键值对数据库吗的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 NoSQL 迁移到 RDBMS

MongoDBHbaseRedis等NoSQL优劣势应用场景

每日习题:MongoDB面试专题

将数据库记录为RDBMS替换

阿里P8架构师谈:MongoDBHbaseRedis等NoSQL优劣势应用场景

阿里P8架构师谈:MongoDBHbaseRedis等NoSQL优劣势应用场景