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