我想在NoSQL中存储文章。每篇文章都有标题,摘要和章节。这没什么大不了的。我还想标记文章,再次轻松做到。我还想存储除名称之外的标签信息,比如定义和图标。每次使用标签时,我都不想存储额外的标签信息。这让我将额外的信息放在一个单独的集合中。那么在NoSQL中可以接受的方式是什么?存储和检索?
例如在SQL中我会有一篇文章,标签和一篇article_tags表,我可以做一些像SELECT * FROM article_tags INNER JOIN tags on tags.id=article_tags.tag_id WHERE article_tags.art_id=##
在NoSQL中我想的是:
article = {
title : 'The article',
tags : ['tag1', 'tag2', ... ],
summary : 'paragraph summary',
sections : ['section 1', 'section 2', ... ]
}
tags = {
tag : 'tag1',
definition : 'The meaning of the tag',
icon : 'URL'
}
但据我所知,在NoSQL中没有相应的JOIN,所以我必须单独调用每个标签来查找其信息。
答案 0 :(得分:0)
您可以使用文档和图形NoSQL数据库,如OrientDB。
答案 1 :(得分:-2)
您必须单独调用 - 具体取决于您使用的NoSQL解决方案。您必须以最有效地利用NoSQL解决方案的优势的方式编写应用程序。
我最熟悉Redis和Python,所以在你的例子中我可能会做这样的结构:
articles = {
title: 'The article.',
tags : ['tag1','tag2','tag3'],
summary : 'paragraph summary',
sections : ['section 1', 'section 2', ... ]
}
然后进行检索(使用适当的Python客户端设置等)
... client setup and connection stuff
key = 'article_id_value'
data = rclient.hget('articles',key)
tags = data['tags']
...
NoSQL的目标是速度,不一定是关系,ACID,或消除更新异常的可能性。最后一个是为什么不太重视标准化而不是在多个位置存储数据。但是,如果您真的非常真实希望规范化,您可以执行以下操作:
articles = {
title: 'The article.',
tags : [tag_key,tag_key,tag_key ],
summary : 'paragraph summary',
sections : ['section 1', 'section 2', ... ]
}
tags = {
tag : 'tag1',
definition : 'The meaning of the tag',
icon : 'URL'
}
然后你会检索:
... client setup and connection stuff
key = 'article_id_value'
data = rclient.hget('articles',key)
tags = data['tags']
tagnames = []
for tag in tags:
tagnames.append(rclient.hget('tags',tag))
data['tagnames'] = tagnames
...
请注意 - 我在查看Python和Redis文档时从内存中执行此操作。我是一名SQL Server DBA,所以我自然倾向于倾向于关系数据建模。