我正在处理的数据是标签的层次结构,这些标签是字符串,而不是我们将执行读取的写入。我们将搜索一个标记,对于搜索字符串是子字符串的任何标记,我们需要返回其完整的层次结构。就好像我们有以下树:
Animals
|
------------------
| |
Tiger Pets
------------------
| |
Dogs Donkey
我们的搜索字符串是" Do"我们需要获得Dogs->Pets->Animals
和Donkey->Pets->Animals
。数据可能非常大,搜索需要尽可能快。我应该如何建模数据以获得所需的结果。哪个更适合:RDBMS或NoSql?
答案 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上搜索会更快。