gpt4 book ai didi

orientdb - 使用 ArangoDb/OrientDb 进行分层数据模型和文档搜索 : is the right solution?

转载 作者:行者123 更新时间:2023-12-01 04:38:48 25 4
gpt4 key购买 nike

我正在开发一个文档管理软件,我正在评估一个用于存储和搜索数据的 noSql 数据库。

总结当项目被组织在目录和子目录中时,软件就像一个文件系统。

树的每个项目可以有n个属性用于过滤和排序。

项目最终也可以通过某种其他关系(父子关系除外)相互连接。

项目数量可能相对较大(数百万),应用程序的 killer 级功能必须是独立于数据库检索数据(使用过滤器和按属性排序)的性能提高。

我需要 3 个关键功能:

  • 获取文件夹的直接子文件夹。对于每个文档属性,结果必须是可分页、可排序和可过滤的

  • 获取文件夹的所有子项(子树的所有项)。对于每个文档属性,结果必须是可分页、可排序和可过滤的

  • 获取文件夹的所有父级

我是 noSql 的新手,实际上我使用的是 rdbms (Sql Server),但我遇到了性能问题以及由文档属性的固定架构引起的所有限制。我正在评估 OrangoDb 或 OrientDb,因为我认为它的功能(面向文档和面向图形)可能是满足我设计需求的最佳解决方案。

你能帮我,给我一个设计数据库和查询这三个任务的建议吗?

铌。我需要查询的结果返回一个数据集,其中每个属性都有一个列:

Es. doc1: p1: v1, p2: v2
doc2: p1: v1, p3: v3

result:
name | p1 | p2 | p3
doc1 v1 v2 null
doc2 v1 null v3

我正在考虑设计一个项目:

{ 
"_id": "_myItemId",
"name`enter code here`" : "Item1",
"itemType": "root / folder / file"
"parentItemId": "",
"properties" : [
{ name: "Property1", formatType: 0, formatMask: "", value: "Value1" },
{ name: "Property2", formatType: 0, formatMask: "", value: "Value2" },
{ name: "Property3", formatType: 0, formatMask: "", value: "Value3" }
]
}

您对能够解决上述 3 个关键功能的设计有什么建议吗?

谢谢

最佳答案

使用图形数据库的方法与其他类型的 dbms 非常不同。您可以使用边“连接”您的实体(顶点),边是一个实体与另一个实体之间的直接链接。所以,首先,你不需要存储例如。每个对象的“parentItemId”,就像您在 Sql 或文档数据库中所做的那样,但是您将拥有两个/三个或多个只有其特定数据的实体;关系将由您在它们之间创建的边缘处理。

OrientdDb 有一个非常好的文档和一些示例来开始理解概念。 EG:教程页面:http://orientdb.com/docs/2.1/Tutorial-Working-with-graphs.html解释图形概念并提供一些很好的示例。

在您的特定情况下,您可以有两种实体类型(顶点),文件夹和文档,以及您调用的边缘,例如。 “ChildOf”(从文档到文件夹)或“包含”(从文件夹到文档)。然后,您可以执行许多查询来查找关系,甚至指定嵌套级别等。

您可以通过以下步骤创建工作模式:

1 创建类和边缘类型:

CREATE CLASS Document Extends V
CREATE CLASS Folder Extends V
CREATE CLASS ChildOf Extends E

2 插入一些文件

INSERT INTO Document SET Title = 'Document 1', Name = '..'
INSERT INTO Document SET Title = 'Document 2', Name = '..'
INSERT INTO Document SET Title = 'Document 3', Name = '..'

3 插入文件夹

INSERT INTO Folder SET Name = 'Folder 1'
INSERT INTO Folder SET Name = 'Folder 2'

4 在顶点之间创建边(关系)

CREATE EDGE ChildOf FROM #<specify document rid here> TO #<specify folder rid here>
...

您还可以通过在两个文件夹之间设置相同的“ChildOf”边缘来创建一个文件夹作为另一个文件夹的子文件夹:

 CREATE EDGE ChildOf FROM #<specify children folder rid here> TO #<specify parent folder rid here>
...

5 查询您的图表。使用 expand() 和 in() 运算符获取文件夹的直接子级:

Select expand(in('ChildOf')) From #<folder rid> Where ...

获取文件夹的所有子文件夹,使用 Traverse 查询从起始文件夹遍历所有子文件夹:

SELECT FROM (
TRAVERSE out('ChildOf') FROM #<folder rid> WHILE $depth <= 3 //you can specify the maximum level of nesting
) where $depth > 0 //exclude the first element (the starting folder itself)

使用遍历和“In”图形运算符获取文件夹的所有父级:

SELECT FROM (
TRAVERSE in('ChildOf') FROM #<folder rid>
) where $depth > 0 //exclude the first element (the starting folder itself)
//here you could filter only the "Folders"
where @class ='Folder'

关于orientdb - 使用 ArangoDb/OrientDb 进行分层数据模型和文档搜索 : is the right solution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33064797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com