跟踪用户关系的最佳数据库是什么?

时间:2012-07-19 20:40:19

标签: nosql couchdb cassandra

我需要在社交应用中跟踪用户关系,如下所示:

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/

2 个答案:

答案 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 } ]
}

这有两个原因:

  1. 如果需要,它允许您轻松地将其他连接数据添加到您可能需要的对象。例如。 { _id: uuid1, followed_on: "2011-10-22" }
  2. include_docs=true选项非常吻合,可以在视图查询中抓取关联的文档。
  3. 更新

    嘿,看看,you can limit the number of revisions kept in the DB