2011-11-22 41 views
0

我有两个表这样的SQL数据库:迁移到SQL核心价值和MapReduce

Users 
Id (PK) 
Name 

Orders 
Id (PK) 
UserId (FK - User.Id) 
Amount 

我想这在的兴趣转移到NoSQL的(即MongoDB的)key-value存储避免连接(在非常大的结果集上)。

  1. 这个结构是否有意义被移到KV数据库?如果不是,我应该添加另一个表,如User_Orders与用户和订单相关吗?

我有一个屏幕显示网格中的订单,但我也想显示用户名。在SQL中,我将使用联接从数据库中提取此信息。

  1. 除了每次Order.UserId查询数据库以获取相关用户以外,NoSQL中是否存在等价物(没有连接)?如果不是,假设我的架构允许我运行多个前端和应用程序服务器,那么如何在此实例中应用(Distributed?)Map-Reduce来实现相同的目标?

谢谢!

回答

1

从关系到NoSQL数据库的一个重大变化是非规格化。根据您的系统中用户名更改的频率,您可以简单地将用户名添加到orders集合(关系表中的)。

所以,你orders收集模式会是什么样子:

{"userId":"abc123", "userName": "Some Name", "orderId":"someorderId","amount":153.23} 

您可以使用简单的find()查询来获得订单和用户的数据。如果名称改变了,它会是一个多文档更新,但如果这种情况不经常发生,那就不是那么糟糕了。在蓝月更新中一次,非规范化是好的,因为它有利于读取。再次,这不是一个经验法则,但完全取决于您的使用案例和设计,以考虑读写比率。

如果用户名的确经常改变,而且你不希望去规范化,那么你总是可以用合适的TTL缓存userId到userName地图,然后在你的应用层查找ID - > Name而不是使用数据库来施加业务限制。

您不需要map-reduce来拉取订单和用户 - 除非您正在进行大量的数据聚合。

+0

遵循这种方法,我将如何跟踪所有需要更新的集合,当另一个更改?我不需要在任何地方修改我的代码以将更新传播到这些集合吗? – Harper

+0

是的,你必须在应用层保持这种逻辑,而不是依赖数据库的约束。如果你有一个阅读繁重的系统,它是相当有效的。如果它写得很重(属于那个特定的属性),那么我绝对不会推荐它。 – lobster1234

+0

谢谢你的回答! – Harper