存储和查询树状分层数据的有效方法

时间:2012-03-08 18:19:32

标签: mongodb database nosql

请看这里的图片:

https://picasaweb.google.com/108987384888529766314/CS3217Project#5717590602842112850

因此,正如您从图像中看到的那样,我们正在尝试将分层数据存储到数据库中。 1个出版商可能有文章,1个文章有很多评论等。因此,如果我使用像SQL Server这样的关系数据库,我将有一个发布者表,然后是一个文章表和一个注释表。但评论表会迅速增长并变得非常大。

因此,是否有任何替代方案可以让我有效地存储和查询这样的树状数据? NoSQL(MongoDB)怎么样?

4 个答案:

答案 0 :(得分:4)

您可以将相邻列表用于分层数据。它高效且易于实施。它也适用于MySQL。这是一个链接:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

答案 1 :(得分:2)

Here是对8个NoSQL分布式数据库及其填充需求的良好调查。

你预计你会写的比你读的更多吗? 您是否预计需要低延迟数据访问,高并发支持和高可用性是必需的? 你需要动态查询吗? 您更喜欢定义索引,而不是map / reduce函数吗? 版本控制很重要吗? 您是否预计会偶尔积累更改数据,以及要运行的预定义查询? 您是否预计您将以可预见的数据库大小快速更改数据(应该主要适合内存)? 您是否预期图形式,丰富或复杂的互连数据? 您是否预计您将需要对类似BigTable的数据进行随机,实时的读/写访问?

答案 2 :(得分:1)

大多数NOSQL数据库设计涉及以下技术的混合:

  • 嵌入 - 在文档中嵌套对象和数组
  • 链接 - 文档之间的引用

您制作的架构取决于您数据的各个方面。您的问题的一个解决方案可能是以下架构:

db.articles { _id: ARTICLE_ID;  publisher: "publisher name";     ...    }
db.comments { _id: COMMENT_ID; article_id: ARTICLE_ID;    ... }

此处,发布者嵌入在文章文档中。我们可以这样做,因为发布商名称不太可能发生变化。它还节省了我们每次需要访问文章时都必须查找发布者详细信息。

评论存储在自己的文档中,每条评论都链接到一篇文章。要查找与文章相关的所有评论,您可以

db.comments.find({article_id:"My Atticle ID"}]

为了加快速度,您可以随时将“article_id”添加到索引

db.comments.ensureIndex({article_id:1})

答案 3 :(得分:1)

我在搜索相同的内容时发现了这个帖子,URL posted by Phpdevpad是一个很好的阅读,以了解邻接列表模型嵌套集模型如何工作和相互比较。这篇文章非常支持嵌套集模型,并解释了邻接列表模型的许多缺点,但我非常关注嵌套方法导致的大量更新

文章中概述的邻接列表的主要限制是每个深度层都需要额外的自联接。但是,使用另一种语言(如php)和隐性功能可以轻松克服此限制,以便查找此处概述的子项:http://www.sitepoint.com/hierarchical-data-database/

使用邻接列表模型从上面的url获取

片段
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
//        used to display a nice indented tree 
function display_children($parent, $level) {

  // retrieve all children of $parent
  $result = mysql_query('SELECT title FROM tree WHERE parent="'.$parent.'";');

  // display each child
  while ($row = mysql_fetch_array($result)) {

    // indent and display the title of this child
    echo str_repeat('  ',$level).$row['title']."n";

    // call this function again to display this
    display_children($row['title'], $level+1);
  }
}

// $node is the name of the node we want the path of
function get_path($node) {

  // look up the parent of this node
  $result = mysql_query('SELECT parent FROM tree WHERE title="'.$node.'";');
  $row = mysql_fetch_array($result);

  // save the path in this array
  $path = array();

  // only continue if this $node isn't the root node
  // (that's the node with no parent)
  if ($row['parent']!='') {

    // the last part of the path to $node, is the name
    // of the parent of $node
    $path[] = $row['parent'];

    // we should add the path to the parent of this node
    // to the path
    $path = array_merge(get_path($row['parent']), $path);
  }

  // return the path
  return $path;
}
display_children('',0);

结论

因此,我现在确信邻接列表模型将更容易使用和管理前进。