0

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

4

2 回答 2

0

您可以使用像OrientDB这样的文档和图形 NoSQL 数据库。

有一个教程解释了 OrientDB 的文档和图形模型

于 2013-10-09T12:41:37.093 回答
-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,所以我自然倾向于关系数据建模。

于 2013-10-09T05:15:41.763 回答