如何在DB中存储标签层次结构数据以快速检索层次结构链?

时间:2015-03-04 12:45:42

标签: sql-server mongodb data-structures database-design nosql

我正在处理的数据是标签的层次结构,这些标签是字符串,而不是我们将执行读取的写入。我们将搜索一个标记,对于搜索字符串是子字符串的任何标记,我们需要返回其完整的层次结构。就好像我们有以下树:


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

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

2 个答案:

答案 0 :(得分:0)

决定使用哪种技术是主观的。在做出这个决定时,你应该考虑的不仅仅是这一个问题。还要记住,没有“典型”NoSQL数据库这样的东西。有许多不同的数据库技术都有不同的工作方式。

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

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

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

答案 1 :(得分:0)

从世界的关系部分,您可以通过多种方式来建模和实施层次结构。您可以在Joe Celko的树和层次结构SQL for Smarties书中找到深入的报道。对于这个特定的任务,我认为路径枚举模型可以很好地工作。在此模型中,您将在树的每个节点中存储路径,因此可以轻松搜索节点和输出路径。 我没有看到基于RDBMS的实现有任何问题。如果“大”实际上“非常巨大”,我会看NoSQL。我相信在RDBMS上搜索会更快。

相关问题