0

我有一堆使用 MLCP 中的 CSV 文件加载的规范化文档。如何使用主键(比如 ID)并找到所有相关文档并将它们合并到一个非规范化文档中?我还需要更改初始文档中的一些值。

4

2 回答 2

2

这是 MarkLogic 的数据中心框架 (DHF) - https://marklogic.github.io/marklogic-data-hub/的主要用例。您仍然需要将 CSV 文件提取到 MLCP 中(这将是您进入暂存数据库的“原始”数据),然后 DHF 提供了一些管道来编写“协调”流程,将所有相关文档合并到一个文档中(这些文件将进入您的最终数据库)。

您也可以使用 CoRB - https://developer.marklogic.com/code/corb来实现这一点。DHF 与 CoRB 类似,但针对这种用例有更多的管道。

于 2019-01-02T18:12:11.713 回答
1

使用像@rjrudin 建议的框架绝对是任何大型工作或正在进行的流程的方法。但是,它仍然有助于进行实验以了解您要求框架做什么。('GIGO')——预先投入一点人的思想和手动努力将获得巨大的回报——“非规范化”不是一个纯粹的机械/客观过程——它是领域知识、创造性妥协和有针对性的数据丰富的混合。

我建议您首先使用与 RDBMS 模式设计相同的过程——考虑查询。从数据/应用程序的主要用户那里获得“前 10 名”列表非常有用,以了解最需要哪些类型的查询/问题以及预期哪些类型的结果和格式。非规范化在上下文之外并没有那么有用——(一个极端的例子是将所有数据简单地放在一个“非规范化”文档中——可能没有用)。

一个简单但有用的概念是 MarkLogic 非常适用于基于“文档”的问题和答案。“像谷歌一样思考”。当您使用 google 时,您在寻找什么?您在寻找网站吗?还是提炼的简明“事实”?聚合/统计 ? 如果您的查询主要属于“给我所有包含有关 XYZ 信息的文档”的类型,那么您可能希望将非规范化为以“XYZ”排序主题为中心的文档。如果您的域具有以文档为中心的自然信息分组(例如,制药公司具有“药物”相关文档,旅游公司具有“财产”相关文档)。非常重要的是要记住,搜索和文档创建/更新都在“文档”中操作 级别——然后让您预期的查询和结果集指导您对“文档”的定义,而不是仅基于从规范化视图中提取的外键关系创建文档。在经典的“业务文档”示例中——如果您的业务域具有以“发票”和“采购订单”为中心的工作流,那么将每个发票设为单独的文档是有意义的,可能会将所有行项目详细信息嵌入其中。但是,如果您的业务工作流专注于库存管理,则对每个库存部件上的文档建模可能更有意义,可能在每个部件中嵌入订单详细信息 - 或两者兼而有之。而不是仅基于从规范化视图中提取的外键关系创建文档。在经典的“业务文档”示例中——如果您的业务域具有以“发票”和“采购订单”为中心的工作流,那么将每个发票设为单独的文档是有意义的,可能会将所有行项目详细信息嵌入其中。但是,如果您的业务工作流专注于库存管理,则对每个库存部件上的文档建模可能更有意义,可能在每个部件中嵌入订单详细信息 - 或两者兼而有之。而不是仅基于从规范化视图中提取的外键关系创建文档。在经典的“业务文档”示例中——如果您的业务域具有以“发票”和“采购订单”为中心的工作流,那么将每个发票设为单独的文档是有意义的,可能会将所有行项目详细信息嵌入其中。但是,如果您的业务工作流专注于库存管理,则对每个库存部件上的文档建模可能更有意义,可能在每个部件中嵌入订单详细信息 - 或两者兼而有之。可能在其中嵌入所有行项目详细信息。但是,如果您的业务工作流专注于库存管理,则对每个库存部件上的文档建模可能更有意义,可能在每个部件中嵌入订单详细信息 - 或两者兼而有之。可能在其中嵌入所有行项目详细信息。但是,如果您的业务工作流专注于库存管理,则对每个库存部件上的文档建模可能更有意义,可能在每个部件中嵌入订单详细信息 - 或两者兼而有之。

一旦确定了文档模型,非规范​​化的机制就非常简单——它几乎与 RDBMS Join 查询相同——除了你不必创建固定的“行”和“列”。QConsole 内部的 XQuery 是试验文档模型的好平台。然后,当您关闭它时,过渡到所描述的框架之一应该很容易。

订单/项目文档非规范化的粗略示例可能如下所示:(伪代码)

for $order in /order_recored_csv/order
let $doc :=  <order> {
  $order/*,

  for $line_item in /item_record_csv/line_item[ order_id = $order/order_id ]
  return   
       <line>{ $line_item/* except $line_item/order_id }</line>
   }
  </order>
return xdmp:document-insert( "/orders/{$doc/order_id}" , $doc )

这将创建一组“订单”文档,每个文档中都有相关的行项目。

然后,您可能希望通过添加客户信息、数据丰富(将 ID 转换为值、从外部源查找数据、分配唯一标识符、版本控制、数据源引用等)进行改进。

于 2019-01-02T23:48:30.503 回答