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

how to save tree data on database to analyze

我打算用 d3js 制作 web 应用程序。它将有关于某事的树状图并且能够被用户add/delete。我想知道如何在数据库中保存树数据。 数据可以是

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

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

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

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

树关系很难存储在 rdbms 中。查看图形数据库。这些是专门用来表示数据库上的图形的。这些应该可以缩放,因为树也是一个图形,这可能是一个不错的选择。我最近参加了一个关于图形数据库——Neo4j——的演讲,它非常有趣。它(或任何其他图形数据库)相对于 rdbms 的主要优点是它可以在图形中存储关系并提供一种简洁的语言来指定关系和查询它们。

http://neo4j.com/

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

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

https://github.com/stefankroes/ancestry