Xml 将结构化数据传入和传出Oracle的最佳(最快、最简单、最高效)方式是什么 < >我想通过应用程序将数据库看作服务,从应用层抽象出一个大型数据库存储(关系型、OLTP)。实现这一点的自然方法是调用存储过程,但传统上,这些存储过程遵循CRUD范式,并且为了与我的抽象思维保持一致,我希望抽象掉数据库中数据结构的所有知识,并专注于业务流程

Xml 将结构化数据传入和传出Oracle的最佳(最快、最简单、最高效)方式是什么 < >我想通过应用程序将数据库看作服务,从应用层抽象出一个大型数据库存储(关系型、OLTP)。实现这一点的自然方法是调用存储过程,但传统上,这些存储过程遵循CRUD范式,并且为了与我的抽象思维保持一致,我希望抽象掉数据库中数据结构的所有知识,并专注于业务流程,xml,oracle,Xml,Oracle,因此,与其采用“保存发票”业务流程,不如采用以下方式 启动事务 创建发票标题 对于发票行项目 创建发票行项目 提交事务 。。。相反,我希望将表示发票的结构化数据传递到数据库中 我可以传递包含发票的XML文档,但这是我希望在数据库方面避免的: 解析XML XML验证 参数提取和到Oracle PL/SQL对象的绑定 当然,在所有情况下,无论解决方案如何,都必须这样做。但是,我不想支付XML文档罚款(角括号税) 因此就产生了一个问题——发送和接收数据以及将数据组织到Oracle存储过程中最有效的方

因此,与其采用“保存发票”业务流程,不如采用以下方式

  • 启动事务
  • 创建发票标题
  • 对于发票行项目
  • 创建发票行项目
  • 提交事务
  • 。。。相反,我希望将表示发票的结构化数据传递到数据库中

    我可以传递包含发票的XML文档,但这是我希望在数据库方面避免的:

  • 解析XML
  • XML验证
  • 参数提取和到Oracle PL/SQL对象的绑定
  • 当然,在所有情况下,无论解决方案如何,都必须这样做。但是,我不想支付XML文档罚款(角括号税)

    因此就产生了一个问题——发送和接收数据以及将数据组织到Oracle存储过程中最有效的方法是什么

    我想听听那些支持JSON、ATOM或其他格式的人的意见


    还考虑本机或二进制机制来实现这一点。如何构造和发送Oracle表(内存数据集)?以前有人这样做过吗?您的体验是什么?

    您可以创建一个集合,在客户端填充,将其传递到
    Oracle
    过程中,并使用它执行基于集合的操作:

    INSERT
    INTO    dest_table
    SELECT  *
    FROM    TABLE(:mycollection)
    

    那要看情况。您可以将数据以任何形式存储为LOB。没有人这样做的主要原因是,您将数据存储在数据库中,以便可以在其中进行搜索。互联网是一个不错的主意,直到谷歌出现,使人们有可能找到东西

    因此,您必须以某种方式解析数据。您可以在客户端上解析它并发送SQL插入/更新。如果你用你最喜欢的OO语言来实现这一点,你会有一个OR映射器(它可以在普通的SQL表中加载和保存“对象”)。这样,繁重的工作(解析)在许多客户机上完成,而数据库只是存储和搜索数据

    < >我想通过应用程序将数据库看作服务,从应用层抽象出一个大型数据库存储(关系型、OLTP)。 这就是DAO层的用途。对于应用程序代码,DAO是一个持久层(用您的术语来说是服务)。DAO知道如何存储结构化文档

    我假定您必须对存储的文档执行SQL查询


    虽然有一种特定于Oracle的XML格式,但我不想使用它,因为它将您的代码绑定到Oracle。只要标准SQL有效,就使用它。

    我不明白为什么要对数据库执行“解析”和“验证”之类的操作

    这可能是因为我们在工作中使用了负载非常重的数据库,所以我的观点有点主观,但基本上,任何可以在数据库之外完成的事情都是在数据库之外完成的,因为数据库是大多数应用程序的瓶颈(“外部”可以很容易地并行化)

    以下是我们在工作中使用的:

    |ID |索引1 |索引2 |索引3 |……|大量数据|

    基本上,索引允许搜索,“大数据块”由应用程序控制。它通常是压缩的序列化(版本化)数据(一些团队在这个blob中存储大约300KB;)

    当然,这需要前端(或库)以统一的方式实际执行序列化+压缩或解压缩+反序列化


    它工作得很好。。。但是,正如我所说的,数据库是我们的瓶颈,所以我们尽量将负载外部化。

    也许可以研究对象关系视图

    请参阅这些链接以了解起点


    因为您使用Oracle,所以在存储过程中解析XML并不是什么大事。在国际海事组织,只有三条合理的道路可走:

    • 在了解数据库结构的客户机上使用DAO
    • 使用存储过程,以便有一点抽象
    • 使用XML

    任何其他结构化文本格式(JSON等)都不如前者,因为XML是Oracle中已有解析器的格式。

    是的,当然每个人都知道DAO对象。它们从数据库中抽象出应用程序,但它们本身会受到数据库中更改的影响。如果只考虑存储过程,我们可以进一步抽象这个层。根据我的示例,这通常通过调用“CreateInvHeader”和“CreateInvDetails”来实现。这不是业务流程级别的完全抽象,这正是我试图实现的。现在,如果我将结构化文档传递给数据库,我就有了更好的抽象,并且不需要构建aDAO层。在拥有专用数据库开发人员的大型团队中,这可能是一个优势。对不起,抽象应该在某个地方停止。:)作为一名Java程序员,我更喜欢在DAO层停止它,因为DAO层知道数据存储的细节。特别是,如果我们想把DB看作是一个(内部)服务,那么我们希望解析和验证入站数据,而不是业务规则,而只需将数据解析成表字段即可。通过您的示例,我看到您正在考虑将关系数据库作为ObjectDB。有意思。你为什么要用数据库呢?如果您只存储带有索引的blob,那么还有其他方法,例如ISAM文件。使用您的存储方案,您将失去95%的RDBMS功能。我们同意。。。不幸的是,技术选择受到环境的限制。我们需要一个可从一百台不同的机器访问的存储点来处理事务