我应该如何将标签层次结构数据存储在数据库中以快速检索层次结构链?

How should I store tag hierarchy data in DB for fast retrieval of hierarchy chains?

我正在处理的数据是标签的层次结构,这些标签是字符串,而不是我们将要执行的读取操作。我们将搜索一个标签,无论搜索字符串是哪个标签的子字符串,我们都需要 return 其相对于根的完整层次结构。就像我们有以下树:


                           Animals
                              |
                     ------------------
                     |                |
                   Tiger             Pets
                               ------------------
                               |                |
                              Dogs             Donkey

如果我们的搜索字符串是 "Do",我们需要得到 Dogs->Pets->AnimalsDonkey->Pets->Animals。数据可能非常大,搜索需要尽可能快。我应该如何对数据建模以获得所需的结果。哪个更适合这个:RDBMS 还是 NoSql?

决定使用哪种技术是主观的。在做出此决定时,您应该考虑的不仅仅是这个查询。还要记住,没有 "typical" NoSQL 数据库这样的东西。有数十种不同的数据库技术,它们的工作方式各不相同。

但是如果您决定使用 MongoDB,您可以通过为每个叶节点创建一个文档来存储标签层次结构,该文档还包括该叶节点的完整标签层次结构,如下所示:

{
     name:"German Shepherd",
     hierarchy: [
         "Animals",
         "Pets",
         "Dogs"
     ]
}

A find({ hierarchy: "Dogs" }) 将 return 所有 "Dogs" 出现在层次结构链中的文档。您可以在 {hierarchy:1} 上创建一个索引,这将大大加快此查询的速度(数组上的索引为所有数组条目创建单独的索引键)。 MongoDB 保留数组条目的顺序,因此您可以依靠层次结构数组的顺序来准确表示层次结构。

在关系领域,有多种方法可以建模和实现层次结构。您可以在 Joe Celko 的 Trees and Hierarchies in SQL for Smarties 一书中找到深入的介绍。对于这个特定的任务,我认为路径枚举模型可以很好地工作。在此模型中,您在树的每个节点中存储一条路径,因此很容易搜索节点和输出路径。 我没有发现基于 RDBMS 的实施有任何问题。如果 'large' 实际上是 'enormously huge',我会查看 NoSQL。我相信在 RDBMS 上搜索会更快。