我正在研究NoSQL技术,我已经探索了一些MongoDB,Riak和Neo4j。
我在问他们是否真的可以根据相关实体的条件来处理遍历或检索数据的问题。
假设我有一个标签表[id,title,created],posts表[id,title,body]和posts_tags表[post_id,tag_id],
我想返回包含2012年8月5日之前创建的标记的帖子。 在SQL世界中它很容易,但是这个问题可以使用NoSQL技术解决吗?
我不仅限于上面提到的NoSQL选项,如果有人对其他引擎的推荐最受欢迎。
我只是想知道这个问题是否可以在NoSQL世界中得到解决,哪些引擎支持解决这类问题。
问题2:这些实体是否在NoSQL方法中正确建模?
问题3:对于其中一个NoSQL选项而言,性能是否值得?还是它仍然很慢? (假设我有200万个帖子和几千个标签)
答案 0 :(得分: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
。
答案 1 :(得分:0)
使用Couchbase,您可以将标签内联存储,就像在Wes的答案中一样,但是然后使用创建一个视图索引,可以轻松查询前缀为“app”的所有标签,例如,这可以返回Apple和应用程序并应用。
本文介绍了在Couch上构建自动填充标记搜索的内容:http://blog.couchbase.com/typeahead-search-couchdb
它有点旧,但一般模式仍然适用。
答案 2 :(得分:0)
因为,正如您所提到的,使用SQL解决问题很容易,也许您应该考虑使用NewSQL数据库,请参阅NoSQL, NewSQL and Beyond