我需要在社交应用中跟踪用户关系,如下所示:
UserA follow UserC, UserD, and UserE
UserZ follow UserC, UserD, and UserE
UserC follow UserA, UserD, and UserE
等等。
首先,我需要一个分区容忍数据库,因此MySQL及其兄弟不在游戏中。
我查看了couchdb,但它为每个更改创建了一个修订版,因此,如果您的文档是这样的:
{
uuid: uuid
name: name,
lastName: lastName
follows: [ uuid1, uuid2, uuid3 ]
}
您将在数据库中进行此其他修订
(rev 1)
{
uuid: uuid
name: name,
lastName: lastName
follows: [ uuid1, uuid2 ]
}
(rev 2)
{
uuid: uuid
name: name,
lastName: lastName
follows: [ uuid1 ]
}
这是一个很大的空间,我知道你可以通过一些手动操作释放它,但问题不会消失。
我看看Cassandra,到目前为止看起来它是一个很好的解决方案,它允许插入没有像couchdb这样的额外空间问题。我可以创建一个关键空间,然后是一个列,然后是一个商店关系,如下所示:
keyspace:{
column:{
...
uuidT:{ uuidA: timestamp, uuidB: timestamp, uuidZ }
uuidF:{ uuidA: timestamp, uuidB: timestamp, uuidZ }
uuidH:{ uuidA: timestamp, uuidB: timestamp, uuidZ }
...
}
}
但我想知道图形数据库是否最适合这种情况。
编辑:
在浏览答案后,我发现此页面有助于选择数据库。 http://nosql.findthebest.com/
答案 0 :(得分:2)
CouchDB意味着离线数据库。
我建议调查一下graphDB,想到neo4j。几个星期前,我在多伦多的Mozilla实验室向我介绍过它,那里的人告诉我,这是最不痛苦的图形数据库来运行(你可以得到/酿造它)。您可以在其中创建任意关系,但它不会分区。如果你想要一个你可以依赖的数据库而你想要建立任意关系,那么Titan可能值得关注。
答案 1 :(得分:1)
FWIW,在CouchDB中,我总是使用对象数组,而不仅仅是ID数组。例如
{
uuid: uuid
name: name,
lastName: lastName
follows: [ { _id: uuid1 }, { _id: uuid2 }, { _id: uuid3 } ]
}
这有两个原因:
{ _id: uuid1, followed_on: "2011-10-22" }
include_docs=true
选项非常吻合,可以在视图查询中抓取关联的文档。