我有一个SQL数据库,有两个表,像这样:
Users
Id (PK)
Name
Orders
Id (PK)
UserId (FK - User.Id)
Amount
我想将其移动到NoSQL(即MongoDb)键值存储中,以避免连接(在非常大的结果集上)。
- 这个结构是否有意义,因为是要移动到KV数据库?如果没有,我是否应该添加另一个表,如User_Orders与用户和订单相关?
我有一个屏幕,在网格中显示订单,但我还想显示用户名。在SQL中,我将使用连接从数据库中提取。
- 除了每个订单查询一次数据库之外,在NoSQL中是否有类似的(没有连接)?UserId获取相关用户?如果没有,我如何申请(分布式?)假设我的体系结构允许我运行多个前端和应用服务器,Map-Reduce在这个实例中实现相同的目标?
谢谢!
从关系数据库到NoSQL数据库的一个大变化是非规范化。根据用户名在系统中更改的频率,您可以简单地将用户名添加到orders
集合(关系术语中的表)。因此,您的orders
集合模式看起来像:
{"userId":"abc123", "userName": "Some Name", "orderId":"someorderId","amount":153.23}
您可以使用简单的find()
查询来获取订单和用户的数据。如果名称要更改,它将是一个多文档更新,但如果这种情况不经常发生,那就没有那么糟糕了。对于偶尔的更新,非规范化是好的,因为它有利于读取。同样,这不是一个经验法则,但它完全取决于您的用例和设计,以考虑读:写比率。
如果用户名经常更改,并且您不希望反规范化,那么您可以始终缓存userId到userName映射,并使用适当的TTL,并在应用程序层查找ID ->名称,而不是使用数据库来强加业务约束。
你不需要map-reduce只是提取订单和用户-除非你正在做大量的数据聚合。