---
title: 数据映射二进制对象
date: 2020-10-21
categories:
  - data-integration
  - database-mapping
  - sql
  - tools
tags:
  - binary-objects
  - data-mapping
description: Altova MapForce是一款屡获殊荣的数据映射工具，它提供了便捷的功能，可以将二进制对象轻松地映射到所有主流的关系型数据库，或从这些数据库映射到二进制对象。
---
Status: #blog

Tags:  #binary-objects #data-mapping

Categories: [data-integration](/blog/zh/category/data-integration.md) | [database + sql](/blog/zh/category/database-sql.md) 
# 数据映射二进制对象

二进制对象在数据库中管理起来比较困难。它们体积庞大，内容无法被人类直接阅读，并且可能包含容易被误解为控制字符的字节数据。 即使是用于表示大型二进制对象的数据类型名称——BLOB——也反映了大多数数据库管理系统对它们的排斥。 在关系数据库出现之前，对BLOB的定义是“某种未定义或无定型的东西”

Altova MapForce，这款屡获殊荣的 [用于任何类型数据之间转换和整合的图形化数据映射工具](https://www.altova.com/zh/mapforce), 它包含功能，可以轻松地将二进制对象映射到所有主流的关系数据库，或从这些数据库中提取数据。例如，图像、PDF文件、视频文件或任何其他类型的二进制数据都可以进行映射。下面我们来看一个例子。

![](/blog/images/blob-insertion.png)

<!--more-->

MapForce 包含两个内置函数，分别是 `read-binary-file` 和 `write-binary-file`，用于在二进制对象和数据库之间进行映射。 在本文中，我们将扩展 MapForce 在线帮助文档中的 `read-binary-file` 示例，构建一个完整的映射，将各种二进制对象插入到关系数据库中。

以下是一个示例，展示了如何将图像插入到数据库中：

[![在线帮助：二进制文件映射示例](/blog/images/help-ex-1.png)](help-ex-1.png)

这个映射会将名为 image01.png 的本地文件插入到数据库表中。我们可以看到，数据库的结构设计包含一些关于图像的元数据，这些元数据存储在不同的列中，可以通过查询来提取相同的图像。您肯定不想将大型二进制数据文件直接导入数据库，而没有办法在以后找到它们！

针对我们的应用场景，我们将创建一个 SQLite 数据库，用于跟踪各种二进制文件。这些文件是市场部门用于支持多个产品的资产，可能包括：产品Logo图像文件、产品数据表的PDF文件、产品使用场景的截图、照片、视频文件等。

我们将从一个简单的 CSV 文本文件开始，用于描述我们要插入的信息：

[![用于数据库上传的CSV模型](/blog/images/csv-model.png)](csv-model.png)

当我们完成这个项目时，用户可能已经在数据库中存储了数十甚至数百个资产。日后，当我们需要检索某个资产时，资产类型的名称将成为查询的关键元数据。但是，如果“类型”列中的任何一项记录出现拼写错误或不一致，那么一个大型二进制对象就会被孤立，并且无法恢复。

我们可以通过将CSV文件导入到XMLSpy中，并生成一个XML Schema，其中“Type”元素的选择项来自一个预定义的列表，从而强制执行资产类型的列表。这样，即使是经验不足的市场营销实习生也能创建一个资产列表 [XMLSpy 网格视图](https://www.altova.com/zh/xmlspy-xml-editor). “类型”字段是强制性的：

[![在 XMLSpy 的网格视图中，数据库上传模型。](/blog/images/grid-view-1.png)](grid-view-1.png)

我们还可以将产品名称列表添加到 XML 模式中，或者至少要求“Product”元素必须存在。我们甚至可以将“Asset”类型的属性设置为 xs:anyURI，从而强制引用一个文件。以下是在 XMLSpy 模式视图中，“Details”辅助窗口中，“Asset”元素的数据类型设置：

[![用于上传模型中“资产”（Asset）元素的 XML Schema 类型定义](/blog/images/asset-details.png)](asset-details.png)

在 MapForce 中，无论我们是从 CSV 还是 XML 格式的数据源进行映射，对二进制对象的映射方式基本相同。

我们将首先创建一个新的 MapForce 数据映射，并将我们的资产列表以及数据库表导入其中。

[![将一组源对象中的二进制数据与数据库表中的相应字段进行映射](/blog/images/map1.png)](map1.png)

我们使用 DatabaseSpy 工具，[创建了一个新的 SQLite 数据库表](https://www.altova.com/zh/databasespy)，并在 MapForce 帮助文档中的示例基础上进行了一些改进。 "product" 列将存储产品名称，而 "asset type"（资产类型）信息则存储在 "description"（描述）列中。 "recordDate" 列将用于记录每个二进制文件的创建时间，从而跟踪其“年龄”。

现在，我们将按照《MapForce帮助文档》中的描述，将“id”列设置为自动编号，并绘制源数据和目标数据之间的简单连接

[![简单地将源对象列表与数据库表进行映射关联](/blog/images/map2.png)](map2.png)

产品和类型信息将直接从源数据映射到数据库中的相应列。将“行”元素映射到数据库，意味着输入数据的每一行都会创建一个新的数据库记录。

现在，我们将二进制数据映射到数据库中的 BLOB (Binary Large Object) 对象

[![将二进制对象映射到数据库中的BLOB（二进制大型对象）](/blog/images/map3.png)](map3.png)

内置的 MapForce 函数 `read-binary-file` 使用源文件中 "Asset" 元素中指定的文件名来创建 BLOB 对象。 无论源文件名如何，`read-binary-file` 函数始终将源数据视为 base64 编码的二进制数据。

为了完成数据映射，我们需要建立连接，以便从“资产”中提取文件名，并保存存储日期

[![完整示例：数据映射二进制对象](/blog/images/map4.png)](map4.png)

“移除文件夹”功能可以自动从任何路径（包括本地文件、网络文件或网页上的文件）中提取文件名。

“now” 函数会记录映射执行的日期和时间，但我们只需要日期，所以我们使用了“substring-before”函数来截取日期部分，从而去除时间信息。

位于映射面板底部的“执行”按钮会执行映射操作，并生成一个SQL脚本

[![用于数据映射的二进制对象的 SQL 脚本](/blog/images/sql-script.png)](sql-script.png)

该脚本仅用于预览目前为止的结果。 要运行该脚本，请在主输出菜单中进行选择

[![提供一个菜单选项，用于执行SQL脚本，以实现数据映射到二进制对象](/blog/images/output-menu.png)](output-menu.png)

脚本执行结果将显示如下：

[![成功完成数据映射后，SQL脚本的执行结果](/blog/images/script-result.png)](script-result.png)

我们将点击“数据库查询”按钮，以连接到数据库，并在MapForce中直接验证结果

[![MapForce 数据库查询窗口，用于验证数据映射的二进制对象](/blog/images/db-query.png)](db-query.png)

虽然通过查看“产品文件”列中的BLOB数据无法获得太多信息，但其他列提供了关于每个资产的有用元数据。

在一个 [后续帖子](https://www.altova.com/blog/data-mapping-binary-objects-part-2/) 我们将演示如何将数据映射到二进制对象 [从数据库中提取资产](https://www.altova.com/blog/data-mapping-binary-objects-part-2/) 并且将它们以原始格式保存。如果您迫不及待， [下载免费试用版](https://www.altova.com/zh/download) 包括教程、帮助文档以及大量示例，帮助您快速上手，开始自己的数据映射、转换和处理项目！
