Architecture 使用引用条件进行NoSQL遍历

Architecture 使用引用条件进行NoSQL遍历,architecture,nosql,Architecture,Nosql,我正在研究NoSQL技术,并对MongoDB、Riak和Neo4j进行了一些探索 我想问的是,他们中是否有人能够真正处理基于相关实体的条件遍历或检索数据的问题 假设我有一个tags表[id,title,created],一个posts表[id,title,body],和一个posts\u tags表[post\u id,tag\u id] 我想返回包含2012年8月5日之前创建的标签的帖子。 在SQL世界中,这很容易,但这个问题是否可以使用NoSQL技术解决 我并不局限于上面提到的NoSQL选项

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

我想问的是,他们中是否有人能够真正处理基于相关实体的条件遍历或检索数据的问题

假设我有一个tags表[id,title,created],一个posts表[id,title,body],和一个posts\u tags表[post\u id,tag\u id]

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

我并不局限于上面提到的NoSQL选项,如果有人对其他引擎有建议的话,我会非常欢迎

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

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


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

我认为在非规范化模型中,所有这三种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")}});
标签上创建一个索引会加快速度

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;
START post=node(*)

将post与Couchbase匹配,您可以在线存储标签,就像Wes的回答一样,但是使用创建视图索引,可以轻松查询前缀为“app”的所有标签,例如,这可以返回Apple和application并应用

本文描述了在沙发上构建自动完成标签搜索的过程:


<>虽然有点老,但一般的模式仍然适用。

因为,正如你提到的,用SQL解决你的问题很容易,也许你应该考虑NeXSQL数据库,请参阅

谢谢你的解释,但是如果我想列出不同的标签呢?例如自动完成。请原谅我关于问题定义的糟糕例子,但也假设我有很多关于标签的元数据,而不仅仅是创建日期。这个解决方案还会更好吗?对于不同的标签,您仍然可以使用您的标签集合。至于您的其他元数据,这真的取决于。如果您希望为标记设置一次性配置元数据,这是一件事(反规范化很容易),但是如果您希望能够更新元数据,并且需要将更改传播到所有反规范化的帖子,无论何时需要这样做,您都会受到影响。@omar.php如果您只需要标签标题,就可以使用它。