Sql server 如何在DB中存储标记层次结构数据,以便快速检索层次结构链?

Sql server 如何在DB中存储标记层次结构数据,以便快速检索层次结构链?,sql-server,mongodb,data-structures,database-design,nosql,Sql Server,Mongodb,Data Structures,Database Design,Nosql,我正在处理的数据是一个标签层次结构,这些标签是字符串,而不是我们将要执行的读操作。我们将搜索一个标记,对于搜索字符串是子字符串的任何标记,我们都需要返回其相对于根的完整层次结构。就像我们有下面的树: 如果我们的搜索字符串是“Do”,我们需要获得狗->宠物->动物和驴->宠物->动物。数据可能相当大,搜索需要尽可能快。我应该如何对数据建模以获得所需的结果。RDBMS和NoSql哪个更合适?使用哪种技术的决定是主观的。在做出这个决定的时候,你需要考虑的不仅仅是这一个问题。还要记住,没有“典型”的N

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



如果我们的搜索字符串是“Do”,我们需要获得
狗->宠物->动物
驴->宠物->动物
。数据可能相当大,搜索需要尽可能快。我应该如何对数据建模以获得所需的结果。RDBMS和NoSql哪个更合适?

使用哪种技术的决定是主观的。在做出这个决定的时候,你需要考虑的不仅仅是这一个问题。还要记住,没有“典型”的NoSQL数据库。有几十种不同的数据库技术,它们的工作方式各不相同

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

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

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

从世界的关系部分来看,有几种方法可以建模和实现层次结构。您可以在《SQL for Smarties》一书中Joe Celko的树和层次结构中找到深入的介绍。对于这个特定的任务,我认为路径枚举模型可以很好地工作。在该模型中,在树的每个节点中存储一条路径,因此很容易搜索节点和输出路径。
我认为基于RDBMS的实现没有任何问题。如果“大型”实际上是“巨大的”,我会查看NoSQL。我相信在RDBMS上搜索会更快。

哪一种更适合RDBMS或NoSQL?两者并不相互排斥。例如,Hive提供了一个用于从hadoop检索的SQL接口。如果你想得到一个好的答案,你需要更多关于数据量和事务量的细节。如果您每天运行1000个事务,请使用RDBMS。一些关系系统开始融入bigdata功能——Oracle从20世纪90年代中期就具备了这一功能,DB2从hbase中汲取了“经验教训”,SQL Server正在积极地使用hadoop的HDFS作为备份存储。
{
     name:"German Shepherd",
     hierarchy: [
         "Animals",
         "Pets",
         "Dogs"
     ]
}