数据映射二进制对象
二进制对象在数据库中管理起来比较困难。它们体积庞大,内容无法被人类直接阅读,并且可能包含容易被误解为控制字符的字节数据。 即使是用于表示大型二进制对象的数据类型名称——BLOB——也反映了大多数数据库管理系统对它们的排斥。 在关系数据库出现之前,对BLOB的定义是“某种未定义或无定型的东西”
Altova MapForce,这款屡获殊荣的 用于任何类型数据之间转换和整合的图形化数据映射工具, 它包含功能,可以轻松地将二进制对象映射到所有主流的关系数据库,或从这些数据库中提取数据。例如,图像、PDF文件、视频文件或任何其他类型的二进制数据都可以进行映射。下面我们来看一个例子。

MapForce 包含两个内置函数,分别是 read-binary-file 和 write-binary-file,用于在二进制对象和数据库之间进行映射。 在本文中,我们将扩展 MapForce 在线帮助文档中的 read-binary-file 示例,构建一个完整的映射,将各种二进制对象插入到关系数据库中。
以下是一个示例,展示了如何将图像插入到数据库中:

这个映射会将名为 image01.png 的本地文件插入到数据库表中。我们可以看到,数据库的结构设计包含一些关于图像的元数据,这些元数据存储在不同的列中,可以通过查询来提取相同的图像。您肯定不想将大型二进制数据文件直接导入数据库,而没有办法在以后找到它们!
针对我们的应用场景,我们将创建一个 SQLite 数据库,用于跟踪各种二进制文件。这些文件是市场部门用于支持多个产品的资产,可能包括:产品Logo图像文件、产品数据表的PDF文件、产品使用场景的截图、照片、视频文件等。
我们将从一个简单的 CSV 文本文件开始,用于描述我们要插入的信息:

当我们完成这个项目时,用户可能已经在数据库中存储了数十甚至数百个资产。日后,当我们需要检索某个资产时,资产类型的名称将成为查询的关键元数据。但是,如果“类型”列中的任何一项记录出现拼写错误或不一致,那么一个大型二进制对象就会被孤立,并且无法恢复。
我们可以通过将CSV文件导入到XMLSpy中,并生成一个XML Schema,其中“Type”元素的选择项来自一个预定义的列表,从而强制执行资产类型的列表。这样,即使是经验不足的市场营销实习生也能创建一个资产列表 XMLSpy 网格视图. “类型”字段是强制性的:

我们还可以将产品名称列表添加到 XML 模式中,或者至少要求“Product”元素必须存在。我们甚至可以将“Asset”类型的属性设置为 xs:anyURI,从而强制引用一个文件。以下是在 XMLSpy 模式视图中,“Details”辅助窗口中,“Asset”元素的数据类型设置:

在 MapForce 中,无论我们是从 CSV 还是 XML 格式的数据源进行映射,对二进制对象的映射方式基本相同。
我们将首先创建一个新的 MapForce 数据映射,并将我们的资产列表以及数据库表导入其中。

我们使用 DatabaseSpy 工具,创建了一个新的 SQLite 数据库表,并在 MapForce 帮助文档中的示例基础上进行了一些改进。 "product" 列将存储产品名称,而 "asset type"(资产类型)信息则存储在 "description"(描述)列中。 "recordDate" 列将用于记录每个二进制文件的创建时间,从而跟踪其“年龄”。
现在,我们将按照《MapForce帮助文档》中的描述,将“id”列设置为自动编号,并绘制源数据和目标数据之间的简单连接

产品和类型信息将直接从源数据映射到数据库中的相应列。将“行”元素映射到数据库,意味着输入数据的每一行都会创建一个新的数据库记录。
现在,我们将二进制数据映射到数据库中的 BLOB (Binary Large Object) 对象

内置的 MapForce 函数 read-binary-file 使用源文件中 "Asset" 元素中指定的文件名来创建 BLOB 对象。 无论源文件名如何,read-binary-file 函数始终将源数据视为 base64 编码的二进制数据。
为了完成数据映射,我们需要建立连接,以便从“资产”中提取文件名,并保存存储日期

“移除文件夹”功能可以自动从任何路径(包括本地文件、网络文件或网页上的文件)中提取文件名。
“now” 函数会记录映射执行的日期和时间,但我们只需要日期,所以我们使用了“substring-before”函数来截取日期部分,从而去除时间信息。
位于映射面板底部的“执行”按钮会执行映射操作,并生成一个SQL脚本

该脚本仅用于预览目前为止的结果。 要运行该脚本,请在主输出菜单中进行选择

脚本执行结果将显示如下:

我们将点击“数据库查询”按钮,以连接到数据库,并在MapForce中直接验证结果

虽然通过查看“产品文件”列中的BLOB数据无法获得太多信息,但其他列提供了关于每个资产的有用元数据。
在一个 [data-mapping-binary-objects-part-2|后续帖子 我们将演示如何将数据映射到二进制对象 [从数据库中提取资产]] 并且将它们以原始格式保存。如果您迫不及待, 下载免费试用版 包括教程、帮助文档以及大量示例,帮助您快速上手,开始自己的数据映射、转换和处理项目!