【问题标题】:What is the accepted way to store linked data in NoSQL?在 NoSQL 中存储链接数据的公认方式是什么?
【发布时间】:2013-10-26 06:29:33
【问题描述】:

我想在 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 等效的方法,因此我必须为每个标签单独调用以查找其信息。

【问题讨论】:

    标签: nosql


    【解决方案1】:

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

    有一个tutorial explaining OrientDB's document and graph model

    【讨论】:

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

      【讨论】:

      • @TheOptimusPrimus ...谢谢你的报复性投票,但我没有投票给你...所以享受你孤独的苦涩
      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 2014-09-18
      • 1970-01-01
      • 2021-10-22
      • 2011-06-07
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多