我知道这个问题已经问了很多遍了,但是我没有一个令人满意的答案。

我读过许多博客,其中大多数都说RDBMS不能水平扩展。解决它的唯一方法是购买更大的机器。

然后我读了为什么它们不能水平缩放。人们说,因为它们根据ACID属性提供了可靠,成熟的服务。我的论点是我们不能删除RDBMS为特定表提供ACID属性。这是无法水平缩放的唯一原因,我们必须考虑NoSQL数据库。

提出的第二个参数是NoSQL数据库将数据存储为单个单元,而RDBMS存储跨多个表的数据。因此,一条数据可能在一个系统中,而它所引用的另一条数据可能在另一系统中。因此,很难按比例缩放RDBMS。我对他们的问题是,如果情况需要,为什么我们不能将所有相关数据存储在一个表中,而是将其分散在多个表中。如果NoSQL可以将数据作为单个单元存储在单个集合中,那么RDBMS为什么不能将数据作为单个单元存储在单个表中。 (例如,为什么必须将订单分为订单表,客户表和付款表。为什么不能将它们合并成一个表,就像NoSQL那样存储)

这也使开发人员无需将内存结构转换为关系结构即可进行开发。

简而言之,我们能否使RDBMS表现得像NoSQL数据库并使其水平扩展?

最佳答案

首先-“水平缩放”是什么意思?

对我来说,水平扩展是我们在MPP(大规模并行处理)数据库中所做的一切-例如Vertica,Teradata,DB2 Parallel Edition,NonStop SQL等:您有一个很大的表,您将它均匀地分布在您的所有节点上MPP群集通常基于主键的哈希值或类似的值。这也是Hadoop和所有其他Map-Reduce架构所做的事情(尽管通常效果不佳,至少到现在为止)。

(只是为了澄清而进行编辑):如果集群中有10个节点,则所有大表都将分布为每个节点上十分之一的数据。现在,扩展将是添加例如10个节点,然后重新分配数据,以便每个表在每个节点上具有其数据的1/20。 MPP数据库线性扩展;这意味着通过加倍具有相同数据量的节点数量,查询现在将以两倍的速度运行。

您的意思似乎有所不同-我对您的意思感到好奇。

对于必须将所有内容拆分为几个表的RDBMS:

RDBMS中的“ R”代表“关系”。在进行所有这些讨论之前,您应该阅读有关关系代数的基础教程。关系只是一组可以用相同属性描述的对象。这样,所有对象都具有相同的属性/列/字段。一旦违反此规则,它就不再是关系/表。

我强烈建议您甚至在开始使用SQL之前就接受有关关系理论和关系数据库的培训。

这是一个广阔的世界,您将有机会探索。归根结底是要设置理论以及布尔和关系代数。您可以用它做很多事情...

您在这里的问题就像在问为什么自行车有两个轮子。

还是我错过了什么?

Marco the Sane

10-04 15:50
查看更多