在NoSQL中存储链接数据的可接受方法是什么?

时间:2013-10-09 04:36:29

标签: nosql

我想在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,所以我必须单独调用每个标签来查找其信息。

2 个答案:

答案 0 :(得分:0)

您可以使用文档和图形NoSQL数据库,如OrientDB

tutorial explaining OrientDB's document and graph model

答案 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,所以我自然倾向于倾向于关系数据建模。