我正试图建立一对多的关系,用户可以链接到许多组织存储桶。
我想走路并将结果返回。
我正在升级stackmob的scala驱动程序以支持链接https://github.com/megamsys/scaliak
任何帮助都将不胜感激。论坛谈论使用mapreduce。
答案 0 :(得分:4)
链接行走是deprecated in the latest version of Riak,可能会在将来的版本中删除。因此,升级Scala驱动程序以支持它可能没有意义。
这里真正的问题是 - 你应该如何在Riak中建立一对多的关系模型?这有两种主要方法,具体取决于您是否具有读取繁重或写入较多的用例。
1 - 链接为键列表
您可以将链接/关联列表存储为单独的对象,以便于检索。例如,如果我有一个存储在/buckets/users/keys/user-id-123
的用户对象:
{ id: "user-id-123", name: "Dmitri", ... }
然后,我可以在/buckets/user-orgs/keys/user-id-123
中存储用户所属的组织(请注意我对用户及其成员资格对象使用相同的密钥):
["organization-id-1", "organization-id-2", "organization-id-3"]
这使我能够回答“这个用户属于哪个组织?”的问题。使用单个GET到user-orgs
对象(以及可选的多个get来获取每个组织对象的ID)。
注意:如果您使用的是Riak 2.0或更高版本,则可以使用新的Riak Data Types(特别是sets数据类型)来存储该ID列表。 (Sets数据类型提供了一种操作API,用于以适合分布式系统的方式从列表中添加/删除/获取元素。)
如果您有大量读取用例(当频繁读取链接列表但未经常写入/更新)时使用此方法。
2 - 搜索/查询链接
另一种主要方法是使用索引(最好通过基于Solr的Riak Search,或者,在极少数情况下,通过Secondary Indexes)和查询来检索一对多关联对象。
所以,如果你有一个用户对象存储在/buckets/users/keys/user-id-123
:
{ id: "user-id-123", name: "Dmitri", ... }
然后,您将在search-enabled中插入多个“成员条目”对象(意味着,您将创建一个搜索索引并将其与user-orgs
存储桶相关联)/buckets/user-orgs/
:
{user_id: "user-id-123", org_id: "organization-1"}
{user_id: "user-id-123", org_id: "organization-2"}
{user_id: "user-id-123", org_id: "organization-3"}
之后,您可以回答“用户属于哪些组织?”的问题。例如,发布一个搜索查询,说明“user-orgs
user_id
等于user-id-123
”的所有对象。
顺便说一下,使用像这样的搜索/会员对象也可以模拟多对多关系(意思是,你可以也回答“哪些用户属于组织{{1} }}?“)。
因为搜索查询比单个GET更昂贵以获取成员资格列表(如第一个策略中所示),所以当您不处于读取大量用例时(当成员资格对象更新时),您应该使用此策略通常,但不经常阅读),或者当你还需要模拟反向关系(多对多)时。
注意: 不使用Map / Reduce建模一对多关系,不要使用不推荐使用的Link Walking机制(使用Map / Reduce)在后端,无论如何)。