javascript - 在图形数据库中存储标签

标签 javascript graph-databases arangodb multi-model-database

我在 relational 中找到了一些关于设置标签系统的建议和 document数据库,但没有图形/多模型数据库。

我正在尝试为 ArangoDB 中的文档(我们称它们为“文章”)设置一个标记系统。我可以想到两种明显的方法来将标签存储在像 Arango 这样的多模型(图形+文档)数据库中:

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

这实际上是实现此目的的两种主要方法吗?两者似乎都不理想。例如:

  • 如果我在每篇文章文档中存储标签,我可以为标签编​​制索引,并且大概 ArangoDB 正在优化它们使用的空间。但是,我不能使用图特征来链接或遍历标签(或者我必须单独进行)。
  • 如果我将标签存储为单独的标签文档,当我只想获取文档上的标签列表时,这似乎是额外的开销(额外的查询)。

这让我想到了一个明确的问题:关于后一个选项,是否有任何简单的方法可以自动使连接的“标签”文档显示在文章文档中?例如。有一个数组属性以某种方式“镜像”连接的标签文档的 tag.name 属性?

也欢迎提出一般性建议。

最佳答案

@Joachim Bøggild 链接到 Mike Williamson:https://mikewilliamson.wordpress.com/2015/07/16/data-modeling-with-arangodb/

我同意 Williamson 的观点,“默认情况下紧凑”是通常要走的路。然后,如果/当实际需要出现时,您可以从属性中提取顶点(又名节点)。它还避免创建过度互连的图结构,这对于所有类型的遍历查询来说都很慢。

但是,在这种情况下,我认为拥有标记顶点(即“文档”,在您的术语中)是件好事,因为您可以在标记上存储元数据(例如计数), 并将其连接到其他标签和子标签。在标签的特殊情况下,它似乎非常有用并且可以立即预见。拥有一个顶点,您可以在需要时向其添加更多关系,这也是非常可扩展的,因此您可以让 future 的选择更加开放(至少更容易)。

似乎Williamson 同意标签值得特别考虑:

"But not everything belongs together. Any attribute that contains a complex data structure (like the “comments” array or the “tags” array) deserves a little scrutiny as it might make sense as a vertex (or vertices) of its own."

@ropeladder 的原始问题提出了主要的反对意见,即它需要额外的开销(额外的查询)。我认为现阶段过多考虑性能可能是不成熟的优化。毕竟;额外的查询可能很快,或者它实际上可能与原始查询结合并包含在原始查询中。无论如何,我会引用这句话:

“In general, it’s bad practice to try to conflate nodes to preserve query-time efficiency. If we model in accordance with the questions we want to ask of our data, an accurate representation of the domain will emerge. Graph databases maintain fast query times even when storing vast amounts of data. Learning to trust our graph database is important when learning to structure our graphs without denormalizing them.” --- from page 64, chapter 'Avoiding Anti-patterns', in the book 'Graph Databases', a book co-written by Eifrem, the founder of Neo4j, another very popular native graph database. It's free and available online here: https://neo4j.com/graph-databases-book/

另请参阅这篇关于一些反模式(密集图与稀疏图)的文章,以补充 Williamson 的观点:https://neo4j.com/blog/dark-side-neo4j-worst-practices/


为了完整性而包含了额外的部分,对于那些想要更深入地研究这个问题的人:

回答 Williamson 自己的标准来决定某物是否应该是一个顶点/节点本身,而不是将其作为文档顶点的一个属性:

Will it be accessed on it’s own? (ie: showing tags without the document)

是的。浏览系统中可用的标签可能很有用。

Will you be running a graph measurement (like GRAPH_BETWEENNESS) on it?

不确定。可能不会。

Will it be edited on it’s own?

是的,可能吧。用户可以单独编辑它。也许管理员/版主想要清理标签名称(更正拼写错误),或清理它们的结构(如果您有子标签)。

Does/could the tags have relationships of it’s own? (assuming you care)

是的。他们可以。子标签或其他类型的内容,而不仅仅是文档。实际上,能够单击一个标签并立即查看带有该标签的所有文档是非常有用的。如果将标签存储为每个文档上的属性数组,这可能是次优的。而图形数据库从根本上针对查询与其他顶点(也称为节点)相邻的顶点的情况进行了优化。

Would/should this attribute exist without it’s parent vertex?

是的。即使删除了最后一个标记的文档,标记也可能/应该存在。稍后可能有人想使用该标签,它代表您可能想要保留的域信息。


关于javascript - 在图形数据库中存储标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35755900/

相关文章:

javascript - 使用 JavaScript 打开动态链接新窗口(但不是弹出窗口)

javascript - 是否可以在 Angular ng-show 表达式中获取 HTML 元素的计数?

javascript - Sinon.js stub 对象内部的匿名函数

neo4j - 重构大型密码联合查询

ArangoDB 示例 : match anything with a key of x?

json - AQL请求有什么问题?

javascript - 你能在 .babelrc 中使用正则表达式吗?

sql-server - 无需循环遍历和获取图中的节点

elasticsearch - 如何标记从 Neo4j 复制到 Elastic 搜索的数据?

arangodb - 检索 arangodb 中没有链接边的顶点