【问题标题】:Migrating SQL to Key Value and MapReduce将 SQL 迁移到键值和 MapReduce
【发布时间】:2011-11-22 00:30:20
【问题描述】:

我有一个包含两个表的 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 来实现相同的目标?

谢谢!

【问题讨论】:

    标签: mongodb join mapreduce key-value-store nosql


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 按照这种方法,当另一个更改发生时,我将如何跟踪所有需要更新的集合?难道我不需要到处修改我的代码来传播对这些集合的更新吗?
    • 是的,您必须将该逻辑保留在应用程序层中,而不是依赖于数据库约束。如果你有一个读取繁重的系统,它相当有效。如果它写得很重(与该特定属性有关),那么我绝对不会推荐它。
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2017-09-07
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多