我有一堆使用MLCP中的CSV文件加载的规范化文档。如何使用主键(例如ID)找到所有相关文档并将其合并为一个非规范化文档?我还需要在初始文档中更改一些值。
答案 0 :(得分:2)
这是MarkLogic的数据中心框架(DHF)-https://marklogic.github.io/marklogic-data-hub/的主要用例。您仍然需要将CSV文件导入MLCP(这是将您的“原始”数据输入到登台数据库中),然后DHF提供了一些编写“和谐”流程的方法,该流程将所有相关文档合并为一个文档(这些文档将进入您的最终数据库)。
您还可以使用CoRB-https://developer.marklogic.com/code/corb实现这一目标。 DHF与CoRB类似,但是对于这种用例而言,DHF具有更多功能。
答案 1 :(得分:0)
使用@rjrudin建议的框架绝对是从事任何大型工作或正在进行的过程的方式。但是,它仍然有助于尝试了解您要求框架做什么的想法。 ('GIGO')-预先付出一些人的思想和手动努力将收获丰厚的回报-'非规范化'不是纯粹的机械/客观过程-它是领域知识,创造性折衷和有针对性的数据丰富的结合。 / p>
我建议您从使用与RDBMS架构设计相同的过程开始-考虑查询。从数据/应用程序的主要用户获得“前十名”列表很有用,它可以确定最需要哪种查询/问题以及需要什么样的结果和格式。非规范化在上下文之外没有什么用(一个极端的例子只是将所有数据放在一个“非规范化”文档中”,可能没有用)。
一个简单但有用的概念是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转换为值,从外部来源查找数据,分配唯一标识符,版本控制,数据来源引用等)来进行改进。