3

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

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/

4

2 回答 2

2

CouchDB 是一个离线数据库。

我建议研究一下graphDB,我想到了neo4j。几周前,我通过多伦多的 Mozilla 实验室介绍了它,那里的人告诉我,运行 graphDB 是最不痛苦的(你可以 apt-get/brew 它)。您可以在其中建立任意关系,但它不会分区。如果您想要一个可以依赖的数据库并且想要建立任意关系,那么Titan可能值得一看。

于 2012-07-21T18:33:39.817 回答
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视图查询中获取相关文档的选项。

更新

嘿,检查一下,您可以限制数据库中保留的修订数量

于 2012-07-20T23:51:33.023 回答