0

我有一个带有两个这样的表的 SQL 数据库:

Users
 Id (PK)
 Name

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

为了避免连接(在非常大的结果集上),我想将其移至 NoSQL(即 MongoDb)键值存储。

  1. 将这种结构按原样移动到 KV 数据库是否有意义?如果没有,我是否应该添加另一个表,如 User_Orders 关联用户和订单?

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

  1. 除了按 Order.UserId 查询数据库一次以获取相关用户之外,NoSQL 中是否存在等价物(无连接)?如果不是,假设我的架构允许我运行多个前端和应用程序服务器,我如何在这种情况下应用(分布式?)Map-Reduce 来实现相同的目标?

谢谢!

4

1 回答 1

1

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

因此,您的orders集合架构将如下所示:

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

您可以使用简单的find()查询来获取有关订单和用户的数据。如果名称要更改,那将是一个多文档更新,但如果这种情况不经常发生,那还不错。对于一次蓝月亮更新,非规范化是好的,因为它有利于读取。同样,这不是经验法则,但完全取决于您的用例和设计来考虑读取:写入比率。

如果用户名确实经常更改,并且您不希望反规范化,那么您始终可以使用适当的 TTL 将 userId 缓存到 userName 映射,并在应用程序层中查找 ID -> Name 而不是使用数据库来施加业务约束。

你不需要 map-reduce 来拉订单和用户——除非你正在做大量的数据聚合。

于 2011-11-22T00:37:16.110 回答