【问题标题】:mongoDB friend relationship and atomic updatemongoDB好友关系和原子更新
【发布时间】:2013-01-08 02:38:18
【问题描述】:

我需要使用 Spring Data 在 MongoDB 中存储用户的朋友关系。我的“模式”解决方案是将朋友的用户名(也是_id)存储在用户文档中。我没有使用 DBRef,因为 Spring Data 和 DBRef 在自我关系上似乎存在问题(朋友是用户:p)。一个简单的用户文档是这样的:

{
"_id" : "user1",
"email" : "user1@test.com",
"friendRequests" : {
    "user4" : 0
},
"friends" : ["user2", "user3" ],
"password" : "$2a$10$9iJWLZjBSu3rq19wh7KTduNXIVcXozsNVjwVogO9eoz0uXO52Z2NC"
}

我认为这个模型足够好。但是当有人接受好友请求时,我必须更新两个用户的文档,并且操作不是原子的。在某些情况下,两者中只有一个得到更新。这不是关键数据,但有一个解决方案仍然会很好。这是我想太多了吗?我在 2 阶段提交 http://cookbook.mongodb.org/patterns/perform-two-phase-commits/ 上找到了这个文档,但对于这种情况来说似乎太多了,尽管它很容易实现。

【问题讨论】:

    标签: mongodb spring-data-mongodb


    【解决方案1】:

    在不知道您的应用程序将如何使用数据的情况下很难回答这类问题。请记住,在 MongoDB 中有许多不同的方式来表示基本相同的数据/模式,因此最适合您的应用程序的方式是适合您的应用程序需求的方式。

    要问自己的一些问题:
    你知道每个用户平均有多少朋友吗?
    您将如何显示/查询/更新用户的朋友?
    上述哪些操作需要高性能且绝对是最新的,哪些可能需要更长的时间,或者稍后以批处理模式完成?

    对于您的数据,每个可能的架构都需要权衡取舍。不断地将用户名添加到每个用户的朋友数组中意味着文档将不断增长(这对于性能更新来说不是最佳的,因为当文档超过其分配的空间时,它需要在下次更新时移动)。为了抵消这一点,您必须考虑以这种方式存储一组朋友时获得的收益。在获取有关用户的所有信息时,它是否使您只能进行一次读取?或者您是否还需要再次读取(也许再次查询用户集合以获取有关朋友数组中每个用户的其他信息?

    您已经在考虑更新的原子性,这有助于保持数据的一致性,但正如您正确指出的那样,这是您的应用程序可以处理的事情(或者您可以有一个运行并检测任何“部分”的后台作业友谊更新并清理它们)。

    您还应该考虑如何为集合建立索引 - 如果您需要在单个集合上使用多个索引来满足查询的 SLA,那么您的更新/插入必然会变慢(因为需要更多索引被更新)。这可能没问题,但只有您可以做出权衡取舍的决定。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回答!现在很难说一个用户会有多少朋友。这不是应用程序的核心功能,至少目前在我看来是这样。我使用了这个解决方案,因为在 stackoverflow 上的其他一些答案中提出了建议。目前我想到的唯一其他解决方案是使用另一个收藏来存储友谊
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-08-30
    • 1970-01-01
    • 2018-06-01
    相关资源
    最近更新 更多