如何在数据库上保存树数据进行分析

时间:2015-01-28 18:50:45

标签: javascript mysql database structure treemap

我将使用d3js制作网络应用程序。它将有关于某事的树图,并且能够由用户添加/删除。我想知道如何在数据库上保存树数据。 数据可能是

var treeData = [
  {
    "name": "Top Level",
    "parent": "null",
    "children": [
      {
        "name": "Level 2: A",
        "parent": "Top Level",
        "children": [
          {
            "name": "Son of A",
            "parent": "Level 2: A"
          },
          {
            "name": "Daughter of A",
            "parent": "Level 2: A"
          }
        ]
      },
      {
        "name": "Level 2: B",
        "parent": "Top Level"
      }
    ]
  }
];

source,target
A1,A2
A2,A3
A2,A4

实际上,我使用哪种结构并不重要,因为数据可以将自己保存在我的mysql数据库中作为" TEXT"。但我想分析数据库中的树数据,如

select * from treemap where secondChildren = 'stackoverflow';
select * from treemap where root = 'c++' and lastChildren = 'java';

由于我的树形图将由用户动态制作,因此我无法创建与子节点一样多的字段。你们有什么想法吗? :)

2 个答案:

答案 0 :(得分:2)

树关系很难存储在rdbms中。查看图表数据库。这些是专门用于表示数据库上的图形。这些应该是可扩展的,因为树也是一个图表,这可能是一个很好的选择。我最近去了一个关于图形数据库 - Neo4j的讨论 - 它非常有趣。它(或任何其他图形数据库)相对于rdbms的主要优点是它可以在图形中存储关系,并提供一种干净的语言来指定关系并对它们进行查询。

http://neo4j.com/

答案 1 :(得分:0)

正如Neo M Hacker所说,neo4j非常适合这类事情。

您使用mySQL进行了标记,因此,如果您仍然使用关系数据库,那么我所见过的最佳解决方案就是拥有一个"祖先"列,用于存储树上祖先ID的描述列表。这样你就可以一次找到整个子树或祖先列表。在ruby中,ancestry gem是如何解决这个问题的一个很好的例子:

https://github.com/stefankroes/ancestry