3

我发现了一些关于在relationaldocument数据库中设置标签系统的建议,但对于图形/多模型数据库没有任何建议。在图数据库中存储标签

我想在ArangoDB中为文档设置标记系统(让我们称之为“文章”)。我能想到的两个明显的方式存储在多模式标签(图+文档),数据库就像阿朗戈:

  • 为每篇文章文档中的数组(文档数据库样式)
  • 作为一个单独的文件类与每个标签作为独特的文档和边缘连接标签文档到文章文档(更接近关系数据库式)

这些实际上是这样做的两个主要方法?这两个都不是理想的。例如:

  • 如果我在每篇文章文档中存储标签,我可以对标签进行索引,据推测ArangoDB正在优化它们使用的空间。但是,我不能使用图形功能链接或遍历标签(或者我必须单独执行)。
  • 如果我将标记存储为单独的标记文档,那么当我只想获取文档上的标记列表时,它看起来像额外的开销(额外的查询)。

这引出了一个明确的问题:关于后一种选择,是否有任何简单的方法可以自动在文档文档中显示相关的“标签”文档?例如。有一个数组属性,以某种方式'连接'连接的标记文档的tag.name属性?

一般建议也是受欢迎的。

+0

答案是否适合您?如果是的话,你能把他们最好的标记为“接受”吗?如果没有,缺少什么? – dothebart

回答

2

你已经提到了大部分可用的判定标准。也许我可以再添加一些:

文档中的关系标签可以使用数组索引来对它们进行过滤,这可以快速地对它们进行查询。但是,如果您想为该标记数组的每个项目添加评分或说明,则无法这样做。如果要计算已标记的文档,这可能比计算源自特定标记的所有边缘更昂贵,或者可能找到符合搜索条件的所有标记。

多模型的一个强大之处在于,您不需要在两种方法之间做出决定。您可以将具有属性的标签与文档连接起来,并在文档中使用相同(平面)标签的索引数组。如果您发现所有(或大部分)查询只使用一种方法,请尝试转换其余的并删除其他解决方案。如果这不起作用,您的应用程序只需要它们两个。

在这两种情况下,寻找其他标记文件可以一起在subequery完成:

LET docs=(FOR ftDoc IN FULLTEXT(articles, 'text', 'search') 
    COLLECT tags = ftDoc.tags INTO tags RETURN {tags, ftDoc}) 
LET tags = FLATTEN(FOR t IN docs[*].tags RETURN t) 
LET otherArticles = (FOR oneTag IN tags 
    FOR oneD IN articles FILTER oneTag IN oneD.tag RETURN oneD._key) 
RETURN {articles: docs, tags: tags, otherArticles: otherArticles} 
2

回答你有关,如果你的内部文件中,并没有连接文件可以自动显示明确的问题。我制作了一个带有单独标签文档的ArangoDB图表,但我认真考虑将它转换为单个项目的属性,因为标签似乎遵循属性标准,而不是相关项目。

迈克·威廉姆森已经做了很好的博客文章如下:https://mikewilliamson.wordpress.com/2015/07/16/data-modeling-with-arangodb/

他认为,有很多边从一个顶点是缓慢的,这将是与边缘与另一热门标签的数量的情况下顶点。