@Joachim Bøggild 将Mike Williamson的文章链接在了一起:https://mikewilliamson.wordpress.com/2015/07/16/data-modeling-with-arangodb/
我同意Williamson的观点,即“默认情况下紧凑”通常是正确的做法。如果需要,你可以从属性中提取出顶点(即节点)。这样还避免了创建过于相互连接的图形结构,这会导致各种遍历查询变得缓慢。
但在这种情况下,我认为拥有标签顶点(即您所说的“文档”)很好,因为您可以在标签上存储元数据(如计数),并将其连接到其他标签和子标签。这在标签的特定情况下似乎非常有用且可以预见。拥有一个顶点,如果/当需要时可以添加更多关系,也非常可扩展,因此您可以保持未来选项更加开放(至少更容易)。
Williamson似乎也认为标签值得特别考虑:
"但是,并非所有东西都应该放在一起。包含复杂数据结构(如“评论”数组或“标签”数组)的任何属性都应该仔细检查,因为它可能作为自己的顶点(或顶点)合理。"
@ropeladder的原始问题提出了主要反对意见,即需要额外的开销(额外的查询)。我认为在这个阶段过于关注性能可能是过早的优化。毕竟;额外的查询可能很快,或者实际上可以与原始查询连接和包含。无论如何,我想引用以下内容:
“通常,试图将节点合并以保持查询时间效率是不好的做法。如果我们按照对数据提出的问题进行建模,就会出现领域的准确表示。即使存储大量数据,图数据库也能保持快速的查询时间。学会信任我们的图形数据库在学习如何构建我们的图形结构时非常重要,而不需要去规范化它们。”
---来自Neo4j创始人Eifrem所写的书籍《图形数据库》第64页,“避免反模式”一章。 Neo4j是另一个非常流行的本地图形数据库。该书免费在线提供,网址:https://neo4j.com/graph-databases-book/
此外,还请参考这篇有关一些反模式(密集vs稀疏图)的文章,以补充Williamson的观点:https://neo4j.com/blog/dark-side-neo4j-worst-practices/
为了完整性,以下为想要更深入了解这个问题的人提供额外的部分:
回答Williamson本身关于决定是否应该将某些内容作为单独的顶点/节点,而不是将其留在文档顶点的属性上的标准:
它能够被单独访问吗?(例如:显示标签而不显示文档)
是的。浏览系统中可用的标签可能会很有用。
您是否会对其运行图测量(例如GRAPH_BETWEENNESS)?
不确定,可能不会。
它会被单独编辑吗?
是的,可能会。用户可以单独编辑它。也许管理员/版主想要清理标签名称(纠正拼写错误),或者清理它们的结构(如果您有子标签)。
标签是否具有自己的关系?(假设您关心)
是的。他们可以。子标签或其他类型的内容,而不仅仅是文档。实际上,点击标签并立即查看具有该标签的所有文档非常有用。使用属性数组将标签存储在每个文档上可能不是最优选择,而图形数据库从根本上针对查询与其他顶点(也称为节点)相邻的顶点的情况进行了优化。
该属性是否应存在其父顶点之外?
是的。即使删除了最后一个标记的文档,标记也可能/应该存在。有人以后可能想要使用该标签,并且它代表您可能想保留的领域信息。