我是arangoDB的新手,有图表.我只是想知道构建边缘是否更快或使用’DOCUMENT()’来进行非常简单的1:1连接,而不需要查询图形? LET a = DOCUMENT(@from)FOR v IN OUTBOUND aCollectionAHasCollectionBRETURN M
LET a = DOCUMENT(@from) FOR v IN OUTBOUND a CollectionAHasCollectionB RETURN MERGE(a,{b:v})
VS
LET a = DOCUMENT(@from) RETURN MERGE(a,{b:DOCUMENT(a.bId)}您可以尝试一个简单的基准:
创建集合产品,类别和边集合has_category.然后生成一些样本数据:
FOR i IN 1..10000 INSERT {_key: TO_STRING(i), name: CONCAT("Product ", i)} INTO products
FOR i IN 1..10000 INSERT {_key: TO_STRING(i), name: CONCAT("Category ", i)} INTO categories
FOR p IN products LET random_categories = ( FOR c IN categories SORT RAND() LIMIT 5 RETURN c._id ) LET category_subset = SLICE(random_categories, 0, RAND()*5+1) UPDATE p WITH { categories: category_subset, categoriesEmbedded: DOCUMENT(category_subset)[*].name } INTO products FOR cat IN category_subset INSERT {_from: p._id, _to: cat} INTO has_category
然后比较不同方法的查询时间.
图遍历(深度1..1):
FOR p IN products RETURN { product: p.name, categories: (FOR v IN OUTBOUND p has_category RETURN v.name) }
使用DOCUMENT()在类别集合中查找:
FOR p IN products RETURN { product: p.name, categories: DOCUMENT(p.categories)[*].name }
使用直接嵌入的类别名称:
FOR p IN products RETURN { product: p.name, categories: p.categoriesEmbedded }
图遍历是所有3中最慢的,另一个集合中的查找比遍历更快,但是最快的查询是具有嵌入类别名称的查询.
但是,如果只查询一个或几个产品的类别,则无论数据模型和查询方法如何,响应时间都应在亚毫秒区域,因此不会造成性能问题.
如果需要查询具有可变深度,长路径,最短路径等的路径,则应选择图形方法.对于您的用例,没有必要.嵌入式方法是否合适是您需要决定的:
>重复信息是否可以接受,并且数据可能存在不一致之处? (如果要更改类别名称,则需要在所有产品记录中更改它,而不仅仅是一个类别文档,产品可以通过不可变ID引用)
>每个类别都有很多额外信息吗?如果是这样,所有这些数据都需要嵌入到具有该类别的每个产品文档中 – 基本上为了性能而交换内存/存储空间
>您是否需要经常检索所有(不同)类别的列表?使用单独的类别集合,您可以非常便宜地执行此类查询.使用嵌入式方法,效率会低得多,因为您需要查看所有产品并收集类别信息.
底线:您应该选择最适合您的用例的数据模型和方法.由于ArangoDB的多模型特性,如果您的用例发生变化或遇到性能问题,您可以轻松尝试其他方法.