NoSQL 数据库设计:图形、文档、边……?
NoSQL database design: graph, documents, edges..?
我是第一次尝试设计 NoSQL 数据库,有些事情我很困惑。
我可以创建包含文档的集合以及包含边的集合。
另一方面,我可以创建通过边连接文档的图形。
我的想法是通过边连接不同的集合(我不知道是否有其他方法可以连接不同的集合)。
所以我不知道我应该将我的数据库构建为图形还是仅作为集合(文档类型)和集合(边缘类型)。
我的集合中的文档包含很多对象和列表,当我搜索图形数据库示例时,我通常会看到图形中的节点只包含很少的信息(例如名称、广告、城市),所以我不然后知道创建包含复杂文档的图表是否是个好主意。我需要图表,因为我想做一个横向的,比如朋友的,朋友的,朋友的...
将 ArangoDB 称为多模型数据库 - 它确实允许您选择最适合您的数据模型的模型。 ArangoDB 及其 AQL 允许您对集合进行连接。联接为更大的数量提供了最佳的可扩展性。如果您将属性附加到两个文档的关系,则连接将被排除。
在执行图形查询后,在内联属性和您加入的辅助集合上的属性之间进行选择取决于您的数据量与您的机器大小的关系。当 运行 在单个服务器实例上时,图形算法的性能更好 - 因此限制图形中的数据量是一个有效的问题。 Otoh 如果您知道该图很可能不会超过一台机器在遍历该图后加入数据会涉及额外成本。
在 ArangoDB 中,边缘被实现为具有预定义 _from
和 _to
属性的文档 - 因此您可以将任何文档结构附加到它上面。
归根结底,文档存储的优势在于,您可以自由组合经常需要组合的结构化数据。
最后,我在没有构建图形的情况下使用文档和边缘,因为我看到 ArangoDB 让我在没有任何图形的情况下进行遍历。参见 https://docs.arangodb.com/Aql/GraphFunctions.html
我是第一次尝试设计 NoSQL 数据库,有些事情我很困惑。
我可以创建包含文档的集合以及包含边的集合。 另一方面,我可以创建通过边连接文档的图形。
我的想法是通过边连接不同的集合(我不知道是否有其他方法可以连接不同的集合)。
所以我不知道我应该将我的数据库构建为图形还是仅作为集合(文档类型)和集合(边缘类型)。
我的集合中的文档包含很多对象和列表,当我搜索图形数据库示例时,我通常会看到图形中的节点只包含很少的信息(例如名称、广告、城市),所以我不然后知道创建包含复杂文档的图表是否是个好主意。我需要图表,因为我想做一个横向的,比如朋友的,朋友的,朋友的...
将 ArangoDB 称为多模型数据库 - 它确实允许您选择最适合您的数据模型的模型。 ArangoDB 及其 AQL 允许您对集合进行连接。联接为更大的数量提供了最佳的可扩展性。如果您将属性附加到两个文档的关系,则连接将被排除。
在执行图形查询后,在内联属性和您加入的辅助集合上的属性之间进行选择取决于您的数据量与您的机器大小的关系。当 运行 在单个服务器实例上时,图形算法的性能更好 - 因此限制图形中的数据量是一个有效的问题。 Otoh 如果您知道该图很可能不会超过一台机器在遍历该图后加入数据会涉及额外成本。
在 ArangoDB 中,边缘被实现为具有预定义 _from
和 _to
属性的文档 - 因此您可以将任何文档结构附加到它上面。
归根结底,文档存储的优势在于,您可以自由组合经常需要组合的结构化数据。
最后,我在没有构建图形的情况下使用文档和边缘,因为我看到 ArangoDB 让我在没有任何图形的情况下进行遍历。参见 https://docs.arangodb.com/Aql/GraphFunctions.html