0

我正在研究 NoSQL 技术,并探索了一些 MongoDB、Riak 和 Neo4j。

我在问他们中的任何一个是否真的可以根据相关实体的条件处理遍历或检索数据的问题。

假设我有一个标签表[id,title,created]、一个帖子表[id,title,body]和一个posts_tags表[post_id,tag_id],

我想返回包含早于 2012 年 8 月 5 日创建的标签的帖子。在 SQL 世界中这很容易,但这个问题可以使用 NoSQL 技术解决吗?

我不限于上面提到的 NoSQL 选项,如果有人对其他引擎有推荐的话,这是最受欢迎的。

我只是想知道这个问题是否可以在 NoSQL 的世界中解决,以及哪些引擎支持这种问题的解决方案。

问题 2:这些实体是否在 NoSQL 方法中正确建模?

问题 3:就性能而言,选择 NoSQL 选项之一是否值得,还是仍然会很慢?(假设我有 200 万个帖子和几千个标签)

4

3 回答 3

0

因为,正如您所提到的,使用 SQL 很容易解决您的问题,也许您应该考虑使用 NewSQL 数据库,请参阅NoSQL、NewSQL 及其他

于 2012-08-08T07:40:57.053 回答
0

我认为所有这三种 NoSQL 技术在标签都直接包含在帖子记录中的非规范化模型中会表现得更好。问题是您想跟踪创建标签的时间,这比标签更烦人,但您仍然可以这样做。您可以拥有您描述的标签集合,然后在将标签添加到帖子时复制创建的时间。如果您希望能够从系统中删除标签,它会变得更加复杂。

在 mongodb(我最有经验的那个)中,你可以这样做:

帖子集合示例:

{
  _id: ...,
  title: "test title",
  body: "body",
  tags: [
    {
      title: "test tag",
      created: ISODate("2012-08-05T02:45:40.575Z")
    },
    { 
      title: "test tag2",
      created: ISODate("2012-08-05T02:47:37.124Z")
    }
  ] 
}

那么您的查询将类似于:

db.posts.find({"tags.created":{$gt:new Date("2012/08/05")}});

并且有一个索引tags.created会加快速度。

TL;DR:在大多数 NoSQL 技术中尝试使用连接表确实没有性能。

从 neo4j 的角度更新以添加一点:

在我看来,您可以在 neo4j 中相对轻松地关联标签和帖子(没有连接表,因为关系实际上是永久连接)。您将搜索不到 2012/08/05,然后找到与这些标签相关的帖子。不需要非规范化。从理论上讲,这是高效的,尽管我还不是 neo4j 专家。在 Cypher 中它看起来像这样:

START post=node(*) 
MATCH post<-[:tagged]-tag 
WHERE tag.created < "2012-08-05" 
RETURN post, tag;

您可以通过索引created并使 START 与索引匹配来加快此查询,而不是使用 WHERE。在本例中,我创建了created一个 ISO 日期字符串,关系类型为tagged.

于 2012-08-05T02:53:14.207 回答
0

使用 Couchbase,您可以像在 Wes 的回答中一样内联存储标签,但是然后使用创建视图索引,以便轻松查询带有前缀“app”的所有标签,例如这可以返回 Apple 和应用程序并应用。

本文描述了在 Couch 上构建自动完成标签搜索的内容:http: //blog.couchbase.com/typeahead-search-couchdb

它有点旧,但一般模式仍然适用。

于 2012-08-07T21:20:28.710 回答