使用 ArangoDb / OrientDb 进行分层数据模型和文档搜索:是正确的解决方案吗?
using ArangoDb / OrientDb for hierarchical data model and document search: is the right solution?
我正在开发一个文档管理软件,我正在评估一个没有Sql 的数据库来存储和搜索数据。
总结当项目在目录和子目录中组织时,软件就像一个文件系统。
树的每个项目都可以有 n 个属性用于筛选和排序。
项目最终也可以通过某种其他关系(父子关系除外)相互连接。
项目数量可能相对较大(数百万),应用程序的杀手级功能必须是
独立于数据库增长的检索数据(使用过滤器和按属性排序)的持续性能。
我需要 3 个关键功能:
获取文件夹的直接子项。每个文档的结果必须是可分页、可排序和可过滤的 属性
获取文件夹的所有子项(子树的所有项目)。每个文档的结果必须是可分页、可排序和可过滤的 属性
获取文件夹的所有父级
我是 noSql 的新手,实际上我使用的是 rdbms(Sql 服务器),但我遇到了性能问题以及由文档属性的固定模式引起的所有限制。
我正在评估 OrangoDb 或 OrientDb,因为我认为它的功能(面向文档和面向图形)可能是满足我的设计需求的最佳解决方案。
你能帮我,给我一个设计数据库和这 3 个任务的查询的建议吗?
铌。我需要查询的结果 return 一个数据集,其中每个 属性:
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 非常不同。您可以 "connect" 您的实体(顶点)使用边,一个实体与另一个实体之间的直接 link。所以,首先,你不需要存储例如。每个对象的 "parentItemId" 就像您在 Sql 或文档数据库中所做的那样,但是您将拥有两个/三个或许多仅包含其特定数据的实体;关系将由您在它们之间创建的边处理。
OrientdDb 有一个很好的文档和一些例子来开始理解概念。 EG:教程页面:http://orientdb.com/docs/2.1/Tutorial-Working-with-graphs.html 解释图形概念并提供一些很好的示例。
在您的特定情况下,您可以有两种实体类型(顶点)、文件夹和文档,以及您称为例如的边。 "ChildOf"(从文档到文件夹)或 "Contains"(从文件夹到文档)。然后您可以执行许多查询来查找关系,甚至指定嵌套级别等。
您可以按照以下步骤创建工作模式:
1 创建 class 和边类型:
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 ...
获取文件夹的所有子项,使用遍历查询从起始文件夹遍历所有子项:
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'
我正在开发一个文档管理软件,我正在评估一个没有Sql 的数据库来存储和搜索数据。
总结当项目在目录和子目录中组织时,软件就像一个文件系统。
树的每个项目都可以有 n 个属性用于筛选和排序。
项目最终也可以通过某种其他关系(父子关系除外)相互连接。
项目数量可能相对较大(数百万),应用程序的杀手级功能必须是 独立于数据库增长的检索数据(使用过滤器和按属性排序)的持续性能。
我需要 3 个关键功能:
获取文件夹的直接子项。每个文档的结果必须是可分页、可排序和可过滤的 属性
获取文件夹的所有子项(子树的所有项目)。每个文档的结果必须是可分页、可排序和可过滤的 属性
获取文件夹的所有父级
我是 noSql 的新手,实际上我使用的是 rdbms(Sql 服务器),但我遇到了性能问题以及由文档属性的固定模式引起的所有限制。 我正在评估 OrangoDb 或 OrientDb,因为我认为它的功能(面向文档和面向图形)可能是满足我的设计需求的最佳解决方案。
你能帮我,给我一个设计数据库和这 3 个任务的查询的建议吗?
铌。我需要查询的结果 return 一个数据集,其中每个 属性:
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 非常不同。您可以 "connect" 您的实体(顶点)使用边,一个实体与另一个实体之间的直接 link。所以,首先,你不需要存储例如。每个对象的 "parentItemId" 就像您在 Sql 或文档数据库中所做的那样,但是您将拥有两个/三个或许多仅包含其特定数据的实体;关系将由您在它们之间创建的边处理。
OrientdDb 有一个很好的文档和一些例子来开始理解概念。 EG:教程页面:http://orientdb.com/docs/2.1/Tutorial-Working-with-graphs.html 解释图形概念并提供一些很好的示例。
在您的特定情况下,您可以有两种实体类型(顶点)、文件夹和文档,以及您称为例如的边。 "ChildOf"(从文档到文件夹)或 "Contains"(从文件夹到文档)。然后您可以执行许多查询来查找关系,甚至指定嵌套级别等。
您可以按照以下步骤创建工作模式:
1 创建 class 和边类型:
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 ...
获取文件夹的所有子项,使用遍历查询从起始文件夹遍历所有子项:
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'