1

我需要使用 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/上找到了这个文档,但对于这种情况来说似乎太多了,尽管它很容易实现。

4

1 回答 1

1

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

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

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

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

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

我希望这有帮助。

于 2013-01-07T18:16:59.357 回答