【问题标题】:How Does NoSQL Scale Out Exactly?NoSQL 如何准确地横向扩展?
【发布时间】:2013-03-31 02:38:46
【问题描述】:
我使用 SQL Server 2012。我有一个按用户 ID 跨物理层分片的数据库。在我的应用程序中,用户是一个聚合根(即,在没有整个用户进出的情况下,关于用户的任何内容都不会来自或进入我的存储库)。关于一个特定用户的一切都存在于一台特定的机器上。
我的系统比使用 NoSQL 的系统可扩展性差吗?或者,有人能解释一下 NoSQL 系统是如何准确地跨服务器扩展的吗?他们不需要以与我正在做的类似的方式进行分片吗?我们都读过 NoSQL 支持可扩展性,但目前我不知道 MongoDB 会如何使我的架构受益。
【问题讨论】:
标签:
sql
nosql
scalability
【解决方案1】:
MongoDB 允许您 scale in two ways: sharding 和 replication。我认为你可以在 MS SQL Server 中做到这两点。
通常不同的是数据模型:
在关系数据库中,通常有多个相互引用的表。从理论上讲,您可以通过使用多个集合来对 MongoDB 做类似的事情,但是这不是通常的做法。相反,在 MongoDB 中,您倾向于将所有属于同一集合的数据存储在同一个集合中。因此,通常您的集合少于数据库中的表。这在很多时候会导致更多的冗余(数据被复制)。您可以尝试在关系数据库中执行此操作,但这并不是那么容易(表会更少,每个都有更多列)。
MongoDB 集合比表更灵活,因为您不需要预先定义数据模型(列/属性的确切列表、数据类型)。这允许您更改数据模型而无需更改表 - 缺点是您需要在应用程序中考虑到这一点(您不能依赖具有相同结构的所有行/文档)。我不确定你是否可以在 MS SQL Server 中做到这一点。
在 MongoDB 中,每个文档都是一个 Json 对象,所以它是一个树而不是一个平面表。这允许数据模型具有更大的灵活性。例如,在我正在开发的应用程序(Apache Jackrabbit Oak / MongoMK)中,对于每个属性(列),我们可以存储多个值;每个版本都有一个值。在关系数据库中这样做是可能的,但相当棘手。